home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / site-packages / impacket / smb.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-06-30  |  81.3 KB  |  2,217 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import sys
  6. import socket
  7. import string
  8. import re
  9. import select
  10. import errno
  11. import nmb
  12. import types
  13. from random import randint
  14. from struct import *
  15. import ntlm
  16. from dcerpc import samr
  17. from structure import Structure
  18. unicode_support = 0
  19. unicode_convert = 1
  20.  
  21. try:
  22.     from cStringIO import StringIO
  23. except ImportError:
  24.     from StringIO import StringIO
  25.  
  26. from binascii import a2b_hex
  27. CVS_REVISION = '$Revision: 1.7 $'
  28. SHARED_DISK = 0
  29. SHARED_PRINT_QUEUE = 1
  30. SHARED_DEVICE = 2
  31. SHARED_IPC = 3
  32. ATTR_ARCHIVE = 32
  33. ATTR_COMPRESSED = 2048
  34. ATTR_NORMAL = 128
  35. ATTR_HIDDEN = 2
  36. ATTR_READONLY = 1
  37. ATTR_TEMPORARY = 256
  38. ATTR_DIRECTORY = 16
  39. ATTR_SYSTEM = 4
  40. SERVICE_DISK = 'A:'
  41. SERVICE_PRINTER = 'LPT1:'
  42. SERVICE_IPC = 'IPC'
  43. SERVICE_COMM = 'COMM'
  44. SERVICE_ANY = '?????'
  45. SV_TYPE_WORKSTATION = 1
  46. SV_TYPE_SERVER = 2
  47. SV_TYPE_SQLSERVER = 4
  48. SV_TYPE_DOMAIN_CTRL = 8
  49. SV_TYPE_DOMAIN_BAKCTRL = 16
  50. SV_TYPE_TIME_SOURCE = 32
  51. SV_TYPE_AFP = 64
  52. SV_TYPE_NOVELL = 128
  53. SV_TYPE_DOMAIN_MEMBER = 256
  54. SV_TYPE_PRINTQ_SERVER = 512
  55. SV_TYPE_DIALIN_SERVER = 1024
  56. SV_TYPE_XENIX_SERVER = 2048
  57. SV_TYPE_NT = 4096
  58. SV_TYPE_WFW = 8192
  59. SV_TYPE_SERVER_NT = 16384
  60. SV_TYPE_POTENTIAL_BROWSER = 65536
  61. SV_TYPE_BACKUP_BROWSER = 131072
  62. SV_TYPE_MASTER_BROWSER = 262144
  63. SV_TYPE_DOMAIN_MASTER = 524288
  64. SV_TYPE_LOCAL_LIST_ONLY = 1073741824
  65. SV_TYPE_DOMAIN_ENUM = 0x80000000L
  66. SMB_O_CREAT = 16
  67. SMB_O_EXCL = 0
  68. SMB_O_OPEN = 1
  69. SMB_O_TRUNC = 2
  70. SMB_SHARE_COMPAT = 0
  71. SMB_SHARE_DENY_EXCL = 16
  72. SMB_SHARE_DENY_WRITE = 32
  73. SMB_SHARE_DENY_READEXEC = 48
  74. SMB_SHARE_DENY_NONE = 64
  75. SMB_ACCESS_READ = 0
  76. SMB_ACCESS_WRITE = 1
  77. SMB_ACCESS_READWRITE = 2
  78. SMB_ACCESS_EXEC = 3
  79. TRANS_DISCONNECT_TID = 1
  80. TRANS_NO_RESPONSE = 2
  81.  
  82. def set_key_odd_parity(key):
  83.     ''
  84.     for i in range(len(key)):
  85.         for k in range(7):
  86.             bit = 0
  87.             t = key[i] >> k
  88.             bit = (t ^ bit) & 1
  89.         
  90.         key[i] = key[i] & 254 | bit
  91.     
  92.     return key
  93.  
  94.  
  95. def strerror(errclass, errcode):
  96.     if errclass == 1:
  97.         return ('OS error', ERRDOS.get(errcode, 'Unknown error'))
  98.     elif errclass == 2:
  99.         return ('Server error', ERRSRV.get(errcode, 'Unknown error'))
  100.     elif errclass == 3:
  101.         return ('Hardware error', ERRHRD.get(errcode, 'Unknown error'))
  102.     elif errclass == 128:
  103.         return ('Browse error', ERRBROWSE.get(errcode, 'Unknown error'))
  104.     elif errclass == 255:
  105.         return ('Bad command', 'Bad command. Please file bug report')
  106.     else:
  107.         return ('Unknown error', 'Unknown error')
  108.  
  109.  
  110. class SessionError(Exception):
  111.     ERRsuccess = 0
  112.     ERRbadfunc = 1
  113.     ERRbadfile = 2
  114.     ERRbadpath = 3
  115.     ERRnofids = 4
  116.     ERRnoaccess = 5
  117.     ERRbadfid = 6
  118.     ERRbadmcb = 7
  119.     ERRnomem = 8
  120.     ERRbadmem = 9
  121.     ERRbadenv = 10
  122.     ERRbadaccess = 12
  123.     ERRbaddata = 13
  124.     ERRres = 14
  125.     ERRbaddrive = 15
  126.     ERRremcd = 16
  127.     ERRdiffdevice = 17
  128.     ERRnofiles = 18
  129.     ERRgeneral = 31
  130.     ERRbadshare = 32
  131.     ERRlock = 33
  132.     ERRunsup = 50
  133.     ERRnetnamedel = 64
  134.     ERRnosuchshare = 67
  135.     ERRfilexists = 80
  136.     ERRinvalidparam = 87
  137.     ERRcannotopen = 110
  138.     ERRinsufficientbuffer = 122
  139.     ERRinvalidname = 123
  140.     ERRunknownlevel = 124
  141.     ERRnotlocked = 158
  142.     ERRrename = 183
  143.     ERRbadpipe = 230
  144.     ERRpipebusy = 231
  145.     ERRpipeclosing = 232
  146.     ERRnotconnected = 233
  147.     ERRmoredata = 234
  148.     ERRnomoreitems = 259
  149.     ERRbaddirectory = 267
  150.     ERReasnotsupported = 282
  151.     ERRlogonfailure = 1326
  152.     ERRbuftoosmall = 2123
  153.     ERRunknownipc = 2142
  154.     ERRnosuchprintjob = 2151
  155.     ERRinvgroup = 2455
  156.     ERRnoipc = 66
  157.     ERRdriveralreadyinstalled = 1795
  158.     ERRunknownprinterport = 1796
  159.     ERRunknownprinterdriver = 1797
  160.     ERRunknownprintprocessor = 1798
  161.     ERRinvalidseparatorfile = 1799
  162.     ERRinvalidjobpriority = 1800
  163.     ERRinvalidprintername = 1801
  164.     ERRprinteralreadyexists = 1802
  165.     ERRinvalidprintercommand = 1803
  166.     ERRinvaliddatatype = 1804
  167.     ERRinvalidenvironment = 1805
  168.     ERRunknownprintmonitor = 3000
  169.     ERRprinterdriverinuse = 3001
  170.     ERRspoolfilenotfound = 3002
  171.     ERRnostartdoc = 3003
  172.     ERRnoaddjob = 3004
  173.     ERRprintprocessoralreadyinstalled = 3005
  174.     ERRprintmonitoralreadyinstalled = 3006
  175.     ERRinvalidprintmonitor = 3007
  176.     ERRprintmonitorinuse = 3008
  177.     ERRprinterhasjobsqueued = 3009
  178.     ERRerror = 1
  179.     ERRbadpw = 2
  180.     ERRbadtype = 3
  181.     ERRaccess = 4
  182.     ERRinvnid = 5
  183.     ERRinvnetname = 6
  184.     ERRinvdevice = 7
  185.     ERRqfull = 49
  186.     ERRqtoobig = 50
  187.     ERRinvpfid = 52
  188.     ERRsmbcmd = 64
  189.     ERRsrverror = 65
  190.     ERRfilespecs = 67
  191.     ERRbadlink = 68
  192.     ERRbadpermits = 69
  193.     ERRbadpid = 70
  194.     ERRsetattrmode = 71
  195.     ERRpaused = 81
  196.     ERRmsgoff = 82
  197.     ERRnoroom = 83
  198.     ERRrmuns = 87
  199.     ERRtimeout = 88
  200.     ERRnoresource = 89
  201.     ERRtoomanyuids = 90
  202.     ERRbaduid = 91
  203.     ERRuseMPX = 250
  204.     ERRuseSTD = 251
  205.     ERRcontMPX = 252
  206.     ERRbadPW = None
  207.     ERRnosupport = 0
  208.     ERRunknownsmb = 22
  209.     ERRnowrite = 19
  210.     ERRbadunit = 20
  211.     ERRnotready = 21
  212.     ERRbadcmd = 22
  213.     ERRdata = 23
  214.     ERRbadreq = 24
  215.     ERRseek = 25
  216.     ERRbadmedia = 26
  217.     ERRbadsector = 27
  218.     ERRnopaper = 28
  219.     ERRwrite = 29
  220.     ERRread = 30
  221.     ERRgeneral = 31
  222.     ERRwrongdisk = 34
  223.     ERRFCBunavail = 35
  224.     ERRsharebufexc = 36
  225.     ERRdiskfull = 39
  226.     hard_msgs = {
  227.         19: ('ERRnowrite', 'Attempt to write on write-protected diskette.'),
  228.         20: ('ERRbadunit', 'Unknown unit.'),
  229.         21: ('ERRnotready', 'Drive not ready.'),
  230.         22: ('ERRbadcmd', 'Unknown command.'),
  231.         23: ('ERRdata', 'Data error (CRC).'),
  232.         24: ('ERRbadreq', 'Bad request structure length.'),
  233.         25: ('ERRseek', 'Seek error.'),
  234.         26: ('ERRbadmedia', 'Unknown media type.'),
  235.         27: ('ERRbadsector', 'Sector not found.'),
  236.         28: ('ERRnopaper', 'Printer out of paper.'),
  237.         29: ('ERRwrite', 'Write fault.'),
  238.         30: ('ERRread', 'Read fault.'),
  239.         31: ('ERRgeneral', 'General failure.'),
  240.         32: ('ERRbadshare', 'An open conflicts with an existing open.'),
  241.         33: ('ERRlock', 'A Lock request conflicted with an existing lock or specified an invalid mode, or an Unlock requested attempted to remove a lock held by another process.'),
  242.         34: ('ERRwrongdisk', 'The wrong disk was found in a drive.'),
  243.         35: ('ERRFCBUnavail', 'No FCBs are available to process request.'),
  244.         36: ('ERRsharebufexc', 'A sharing buffer has been exceeded.') }
  245.     dos_msgs = {
  246.         ERRbadfunc: ('ERRbadfunc', 'Invalid function.'),
  247.         ERRbadfile: ('ERRbadfile', 'File not found.'),
  248.         ERRbadpath: ('ERRbadpath', 'Directory invalid.'),
  249.         ERRnofids: ('ERRnofids', 'No file descriptors available'),
  250.         ERRnoaccess: ('ERRnoaccess', 'Access denied.'),
  251.         ERRbadfid: ('ERRbadfid', 'Invalid file handle.'),
  252.         ERRbadmcb: ('ERRbadmcb', 'Memory control blocks destroyed.'),
  253.         ERRnomem: ('ERRnomem', 'Insufficient server memory to perform the requested function.'),
  254.         ERRbadmem: ('ERRbadmem', 'Invalid memory block address.'),
  255.         ERRbadenv: ('ERRbadenv', 'Invalid environment.'),
  256.         11: ('ERRbadformat', 'Invalid format.'),
  257.         ERRbadaccess: ('ERRbadaccess', 'Invalid open mode.'),
  258.         ERRbaddata: ('ERRbaddata', 'Invalid data.'),
  259.         ERRres: ('ERRres', 'reserved.'),
  260.         ERRbaddrive: ('ERRbaddrive', 'Invalid drive specified.'),
  261.         ERRremcd: ('ERRremcd', "A Delete Directory request attempted  to  remove  the  server's  current directory."),
  262.         ERRdiffdevice: ('ERRdiffdevice', 'Not same device.'),
  263.         ERRnofiles: ('ERRnofiles', 'A File Search command can find no more files matching the specified criteria.'),
  264.         ERRbadshare: ('ERRbadshare', 'The sharing mode specified for an Open conflicts with existing  FIDs  on the file.'),
  265.         ERRlock: ('ERRlock', 'A Lock request conflicted with an existing lock or specified an  invalid mode,  or an Unlock requested attempted to remove a lock held by another process.'),
  266.         ERRunsup: ('ERRunsup', 'The operation is unsupported'),
  267.         ERRnosuchshare: ('ERRnosuchshare', 'You specified an invalid share name'),
  268.         ERRfilexists: ('ERRfilexists', 'The file named in a Create Directory, Make  New  File  or  Link  request already exists.'),
  269.         ERRinvalidname: ('ERRinvalidname', 'Invalid name'),
  270.         ERRbadpipe: ('ERRbadpipe', 'Pipe invalid.'),
  271.         ERRpipebusy: ('ERRpipebusy', 'All instances of the requested pipe are busy.'),
  272.         ERRpipeclosing: ('ERRpipeclosing', 'Pipe close in progress.'),
  273.         ERRnotconnected: ('ERRnotconnected', 'No process on other end of pipe.'),
  274.         ERRmoredata: ('ERRmoredata', 'There is more data to be returned.'),
  275.         ERRinvgroup: ('ERRinvgroup', 'Invalid workgroup (try the -W option)'),
  276.         ERRlogonfailure: ('ERRlogonfailure', 'Logon failure'),
  277.         ERRdiskfull: ('ERRdiskfull', 'Disk full'),
  278.         ERRgeneral: ('ERRgeneral', 'General failure'),
  279.         ERRunknownlevel: ('ERRunknownlevel', 'Unknown info level') }
  280.     server_msgs = {
  281.         1: ('ERRerror', 'Non-specific error code.'),
  282.         2: ('ERRbadpw', 'Bad password - name/password pair in a Tree Connect or Session Setup are invalid.'),
  283.         3: ('ERRbadtype', 'reserved.'),
  284.         4: ('ERRaccess', 'The requester does not have  the  necessary  access  rights  within  the specified  context for the requested function. The context is defined by the TID or the UID.'),
  285.         5: ('ERRinvnid', 'The tree ID (TID) specified in a command was invalid.'),
  286.         6: ('ERRinvnetname', 'Invalid network name in tree connect.'),
  287.         7: ('ERRinvdevice', 'Invalid device - printer request made to non-printer connection or  non-printer request made to printer connection.'),
  288.         49: ('ERRqfull', 'Print queue full (files) -- returned by open print file.'),
  289.         50: ('ERRqtoobig', 'Print queue full -- no space.'),
  290.         51: ('ERRqeof', 'EOF on print queue dump.'),
  291.         52: ('ERRinvpfid', 'Invalid print file FID.'),
  292.         64: ('ERRsmbcmd', 'The server did not recognize the command received.'),
  293.         65: ('ERRsrverror', 'The server encountered an internal error, e.g., system file unavailable.'),
  294.         67: ('ERRfilespecs', 'The file handle (FID) and pathname parameters contained an invalid  combination of values.'),
  295.         68: ('ERRreserved', 'reserved.'),
  296.         69: ('ERRbadpermits', 'The access permissions specified for a file or directory are not a valid combination.  The server cannot set the requested attribute.'),
  297.         70: ('ERRreserved', 'reserved.'),
  298.         71: ('ERRsetattrmode', 'The attribute mode in the Set File Attribute request is invalid.'),
  299.         81: ('ERRpaused', 'Server is paused.'),
  300.         82: ('ERRmsgoff', 'Not receiving messages.'),
  301.         83: ('ERRnoroom', 'No room to buffer message.'),
  302.         87: ('ERRrmuns', 'Too many remote user names.'),
  303.         88: ('ERRtimeout', 'Operation timed out.'),
  304.         89: ('ERRnoresource', 'No resources currently available for request.'),
  305.         90: ('ERRtoomanyuids', 'Too many UIDs active on this session.'),
  306.         91: ('ERRbaduid', 'The UID is not known as a valid ID on this session.'),
  307.         250: ('ERRusempx', 'Temp unable to support Raw, use MPX mode.'),
  308.         251: ('ERRusestd', 'Temp unable to support Raw, use standard read/write.'),
  309.         252: ('ERRcontmpx', 'Continue in MPX mode.'),
  310.         253: ('ERRreserved', 'reserved.'),
  311.         254: ('ERRreserved', 'reserved.'),
  312.         65535: ('ERRnosupport', 'Function not supported.') }
  313.     ERRDOS = 1
  314.     error_classes = {
  315.         0: ('SUCCESS', { }),
  316.         ERRDOS: ('ERRDOS', dos_msgs),
  317.         2: ('ERRSRV', server_msgs),
  318.         3: ('ERRHRD', hard_msgs),
  319.         4: ('ERRXOS', { }),
  320.         225: ('ERRRMX1', { }),
  321.         226: ('ERRRMX2', { }),
  322.         227: ('ERRRMX3', { }),
  323.         255: ('ERRCMD', { }) }
  324.     
  325.     def __init__(self, str, error_class, error_code):
  326.         self.args = str
  327.         self.error_class = error_class
  328.         self.error_code = error_code
  329.  
  330.     
  331.     def get_error_class(self):
  332.         return self.error_class
  333.  
  334.     
  335.     def get_error_code(self):
  336.         return self.error_code
  337.  
  338.     
  339.     def __str__(self):
  340.         error_class = SessionError.error_classes.get(self.error_class, None)
  341.         if not error_class:
  342.             error_code_str = self.error_code
  343.             error_class_str = self.error_class
  344.         else:
  345.             error_class_str = error_class[0]
  346.             error_code = error_class[1].get(self.error_code, None)
  347.             if not error_code:
  348.                 error_code_str = self.error_code
  349.             else:
  350.                 error_code_str = '%s(%s)' % error_code
  351.         return 'SessionError: %s, class: %s, code: %s' % (self.args, error_class_str, error_code_str)
  352.  
  353.  
  354.  
  355. class UnsupportedFeature(Exception):
  356.     pass
  357.  
  358.  
  359. class SharedDevice:
  360.     
  361.     def __init__(self, name, type, comment):
  362.         self._SharedDevice__name = name
  363.         self._SharedDevice__type = type
  364.         self._SharedDevice__comment = comment
  365.  
  366.     
  367.     def get_name(self):
  368.         return self._SharedDevice__name
  369.  
  370.     
  371.     def get_type(self):
  372.         return self._SharedDevice__type
  373.  
  374.     
  375.     def get_comment(self):
  376.         return self._SharedDevice__comment
  377.  
  378.     
  379.     def __repr__(self):
  380.         return '<SharedDevice instance: name=' + self._SharedDevice__name + ', type=' + str(self._SharedDevice__type) + ', comment="' + self._SharedDevice__comment + '">'
  381.  
  382.  
  383.  
  384. class SharedFile:
  385.     
  386.     def __init__(self, ctime, atime, mtime, filesize, allocsize, attribs, shortname, longname):
  387.         self._SharedFile__ctime = ctime
  388.         self._SharedFile__atime = atime
  389.         self._SharedFile__mtime = mtime
  390.         self._SharedFile__filesize = filesize
  391.         self._SharedFile__allocsize = allocsize
  392.         self._SharedFile__attribs = attribs
  393.         
  394.         try:
  395.             self._SharedFile__shortname = shortname[:string.index(shortname, '\x00')]
  396.         except ValueError:
  397.             self._SharedFile__shortname = shortname
  398.  
  399.         
  400.         try:
  401.             self._SharedFile__longname = longname[:string.index(longname, '\x00')]
  402.         except ValueError:
  403.             self._SharedFile__longname = longname
  404.  
  405.  
  406.     
  407.     def get_ctime(self):
  408.         return self._SharedFile__ctime
  409.  
  410.     
  411.     def get_ctime_epoch(self):
  412.         return self._SharedFile__convert_smbtime(self._SharedFile__ctime)
  413.  
  414.     
  415.     def get_mtime(self):
  416.         return self._SharedFile__mtime
  417.  
  418.     
  419.     def get_mtime_epoch(self):
  420.         return self._SharedFile__convert_smbtime(self._SharedFile__mtime)
  421.  
  422.     
  423.     def get_atime(self):
  424.         return self._SharedFile__atime
  425.  
  426.     
  427.     def get_atime_epoch(self):
  428.         return self._SharedFile__convert_smbtime(self._SharedFile__atime)
  429.  
  430.     
  431.     def get_filesize(self):
  432.         return self._SharedFile__filesize
  433.  
  434.     
  435.     def get_allocsize(self):
  436.         return self._SharedFile__allocsize
  437.  
  438.     
  439.     def get_attributes(self):
  440.         return self._SharedFile__attribs
  441.  
  442.     
  443.     def is_archive(self):
  444.         return self._SharedFile__attribs & ATTR_ARCHIVE
  445.  
  446.     
  447.     def is_compressed(self):
  448.         return self._SharedFile__attribs & ATTR_COMPRESSED
  449.  
  450.     
  451.     def is_normal(self):
  452.         return self._SharedFile__attribs & ATTR_NORMAL
  453.  
  454.     
  455.     def is_hidden(self):
  456.         return self._SharedFile__attribs & ATTR_HIDDEN
  457.  
  458.     
  459.     def is_readonly(self):
  460.         return self._SharedFile__attribs & ATTR_READONLY
  461.  
  462.     
  463.     def is_temporary(self):
  464.         return self._SharedFile__attribs & ATTR_TEMPORARY
  465.  
  466.     
  467.     def is_directory(self):
  468.         return self._SharedFile__attribs & ATTR_DIRECTORY
  469.  
  470.     
  471.     def is_system(self):
  472.         return self._SharedFile__attribs & ATTR_SYSTEM
  473.  
  474.     
  475.     def get_shortname(self):
  476.         return self._SharedFile__shortname
  477.  
  478.     
  479.     def get_longname(self):
  480.         return self._SharedFile__longname
  481.  
  482.     
  483.     def __repr__(self):
  484.         return '<SharedFile instance: shortname="' + self._SharedFile__shortname + '", longname="' + self._SharedFile__longname + '", filesize=' + str(self._SharedFile__filesize) + '>'
  485.  
  486.     
  487.     def __convert_smbtime(self, t):
  488.         x = t >> 32
  489.         y = t & 0xFFFFFFFFL
  490.         geo_cal_offset = 11644473600.0
  491.         return (x * 4.0 * (1 << 30) + (y & 0xFFF00000L)) * 9.9999999999999995e-08 - geo_cal_offset
  492.  
  493.  
  494.  
  495. class SMBMachine:
  496.     
  497.     def __init__(self, nbname, type, comment):
  498.         self._SMBMachine__nbname = nbname
  499.         self._SMBMachine__type = type
  500.         self._SMBMachine__comment = comment
  501.  
  502.     
  503.     def __repr__(self):
  504.         return '<SMBMachine instance: nbname="' + self._SMBMachine__nbname + '", type=' + hex(self._SMBMachine__type) + ', comment="' + self._SMBMachine__comment + '">'
  505.  
  506.  
  507.  
  508. class SMBDomain:
  509.     
  510.     def __init__(self, nbgroup, type, master_browser):
  511.         self._SMBDomain__nbgroup = nbgroup
  512.         self._SMBDomain__type = type
  513.         self._SMBDomain__master_browser = master_browser
  514.  
  515.     
  516.     def __repr__(self):
  517.         return '<SMBDomain instance: nbgroup="' + self._SMBDomain__nbgroup + '", type=' + hex(self._SMBDomain__type) + ', master browser="' + self._SMBDomain__master_browser + '">'
  518.  
  519.  
  520.  
  521. class NewSMBPacket(Structure):
  522.     structure = (('Signature', '"\xffSMB'), ('Command', 'B=0'), ('ErrorClass', 'B=0'), ('_reserved', 'B=0'), ('ErrorCode', '<H=0'), ('Flags1', 'B=0'), ('Flags2', '<H=0'), ('Padding', '12s=""'), ('Tid', '<H=0xffff'), ('Pid', '<H=0'), ('Uid', '<H=0'), ('Mid', '<H=0'), ('Data', '*:'))
  523.     
  524.     def __init__(self, **kargs):
  525.         Structure.__init__(self, **kargs)
  526.         if not kargs.has_key('data'):
  527.             self['Data'] = []
  528.         
  529.  
  530.     
  531.     def addCommand(self, command):
  532.         if len(self['Data']) == 0:
  533.             self['Command'] = command.command
  534.         else:
  535.             self['Data'][-1]['Parameters']['AndXCommand'] = command.command
  536.             self['Data'][-1]['Parameters']['AndXOffset'] = len(self)
  537.         self['Data'].append(command)
  538.  
  539.     
  540.     def isMoreData(self):
  541.         if self['Command'] in [
  542.             SMB.SMB_COM_TRANSACTION,
  543.             SMB.SMB_COM_READ_ANDX,
  544.             SMB.SMB_COM_READ_RAW] and self['ErrorClass'] == 1:
  545.             pass
  546.         return self['ErrorCode'] == SessionError.ERRmoredata
  547.  
  548.     
  549.     def isValidAnswer(self, cmd):
  550.         if self['Command'] == cmd:
  551.             if self['ErrorClass'] == 0 and self['ErrorCode'] == 0:
  552.                 return 1
  553.             elif self.isMoreData():
  554.                 return 1
  555.             
  556.             raise SessionError, ('SMB Library Error', self['ErrorClass'], self['ErrorCode'])
  557.         else:
  558.             raise UnsupportedFeature, 'Unexpected answer from server: Got %d, Expected %d' % (self['Command'], cmd)
  559.  
  560.  
  561.  
  562. class SMBPacket:
  563.     
  564.     def __init__(self, data = ''):
  565.         self._command = 0
  566.         self._error_class = 0
  567.         self._error_code = 0
  568.         self._flags = 0
  569.         self._flags2 = 0
  570.         self._pad = '\x00' * 12
  571.         self._tid = 0
  572.         self._pid = 0
  573.         self._uid = 0
  574.         self._mid = 0
  575.         self._wordcount = 0
  576.         self._parameter_words = ''
  577.         self._bytecount = 0
  578.         self._buffer = ''
  579.         if data != '':
  580.             self._command = ord(data[4])
  581.             self._error_class = ord(data[5])
  582.             self._error_code = unpack('<H', data[7:9])[0]
  583.             self._flags = ord(data[9])
  584.             self._flags2 = unpack('<H', data[10:12])[0]
  585.             self._tid = unpack('<H', data[24:26])[0]
  586.             self._pid = unpack('<H', data[26:28])[0]
  587.             self._uid = unpack('<H', data[28:30])[0]
  588.             self._mid = unpack('<H', data[30:32])[0]
  589.             self._wordcount = ord(data[32])
  590.             self._parameter_words = data[33:33 + self._wordcount * 2]
  591.             self._bytecount = ord(data[33 + self._wordcount * 2])
  592.             self._buffer = data[35 + self._wordcount * 2:]
  593.         
  594.  
  595.     
  596.     def set_command(self, command):
  597.         self._command = command
  598.  
  599.     
  600.     def set_error_class(self, error_class):
  601.         self._error_class = error_class
  602.  
  603.     
  604.     def set_error_code(self, error_code):
  605.         self._error_code = error_code
  606.  
  607.     
  608.     def set_flags(self, flags):
  609.         self._flags = flags
  610.  
  611.     
  612.     def set_flags2(self, flags2):
  613.         self._flags2 = flags2
  614.  
  615.     
  616.     def set_pad(self, pad):
  617.         self._pad = pad
  618.  
  619.     
  620.     def set_tid(self, tid):
  621.         self._tid = tid
  622.  
  623.     
  624.     def set_pid(self, pid):
  625.         self._pid = pid
  626.  
  627.     
  628.     def set_uid(self, uid):
  629.         self._uid = uid
  630.  
  631.     
  632.     def set_mid(self, mid):
  633.         self._mid = mid
  634.  
  635.     
  636.     def set_parameter_words(self, param):
  637.         self._parameter_words = param
  638.         self._wordcount = len(param) / 2
  639.  
  640.     
  641.     def set_buffer(self, buffer):
  642.         if type(buffer) is types.UnicodeType:
  643.             raise Exception('SMBPacket: Invalid buffer. Received unicode')
  644.         
  645.         self._buffer = buffer
  646.         self._bytecount = len(buffer)
  647.  
  648.     
  649.     def get_command(self):
  650.         return self._command
  651.  
  652.     
  653.     def get_error_class(self):
  654.         return self._error_class
  655.  
  656.     
  657.     def get_error_code(self):
  658.         return self._error_code
  659.  
  660.     
  661.     def get_flags(self):
  662.         return self._flags
  663.  
  664.     
  665.     def get_flags2(self):
  666.         return self._flags2
  667.  
  668.     
  669.     def get_pad(self):
  670.         return self._pad
  671.  
  672.     
  673.     def get_tid(self):
  674.         return self._tid
  675.  
  676.     
  677.     def get_pid(self):
  678.         return self._pid
  679.  
  680.     
  681.     def get_uid(self):
  682.         return self._uid
  683.  
  684.     
  685.     def get_mid(self):
  686.         return self._mid
  687.  
  688.     
  689.     def get_parameter_words(self):
  690.         return self._parameter_words
  691.  
  692.     
  693.     def get_wordcount(self):
  694.         return self._wordcount
  695.  
  696.     
  697.     def get_bytecount(self):
  698.         return self._bytecount
  699.  
  700.     
  701.     def get_buffer(self):
  702.         return self._buffer
  703.  
  704.     
  705.     def rawData(self):
  706.         data = pack('<4sBBBHBH12sHHHHB', '\xffSMB', self._command, self._error_class, 0, self._error_code, self._flags, self._flags2, self._pad, self._tid, self._pid, self._uid, self._mid, self._wordcount) + self._parameter_words + pack('<H', self._bytecount) + self._buffer
  707.         return data
  708.  
  709.  
  710.  
  711. class TRANSHeader:
  712.     
  713.     def __init__(self, params = '', data = ''):
  714.         self._total_param_count = 0
  715.         self._total_data_count = 0
  716.         self._max_param_count = 0
  717.         self._max_data_count = 0
  718.         self._max_setup_count = 0
  719.         self._flags = 0
  720.         self._timeout = 0
  721.         self._param_count = 0
  722.         self._param_offset = 0
  723.         self._data_count = 0
  724.         self._data_offset = 0
  725.         self._setup_count = 0
  726.         self._setup = 0
  727.         self._name = ''
  728.         self._pad = ''
  729.         self._parameters = 0
  730.         self._data = 0
  731.         if data != '' and params != '':
  732.             (self._total_param_count, self._total_data_count, _, self._param_count, self._param_offset, self._param_displacement, self._data_count, self._data_offset, self._data_displacement, self._setup_count, _) = unpack('<HHHHHHHHHBB', params)
  733.             self._data = data[-(self._data_count):]
  734.         
  735.  
  736.     
  737.     def set_flags(self, flags):
  738.         self._flags = flags
  739.  
  740.     
  741.     def set_name(self, name):
  742.         self._name = name
  743.  
  744.     
  745.     def set_setup(self, setup):
  746.         self._setup = setup
  747.  
  748.     
  749.     def set_parameters(self, parameters):
  750.         self._parameters = parameters
  751.         self._total_param_count = len(parameters)
  752.  
  753.     
  754.     def set_data(self, data):
  755.         self._data = data
  756.         self._total_data_count = len(data)
  757.  
  758.     
  759.     def set_max_data_count(self, max):
  760.         self._max_data_count = max
  761.  
  762.     
  763.     def set_max_param_count(self, max):
  764.         self._max_param_count = max
  765.  
  766.     
  767.     def get_rawParameters(self):
  768.         self._param_offset = 32 + 3 + 28 + len(self._setup) + len(self._name)
  769.         self._data_offset = self._param_offset + len(self._parameters)
  770.         return pack('<HHHHBBHLHHHHHBB', self._total_param_count, self._total_data_count, self._max_param_count, self._max_data_count, self._max_setup_count, 0, self._flags, self._timeout, 0, self._total_param_count, self._param_offset, self._total_data_count, self._data_offset, len(self._setup) / 2, 0) + self._setup
  771.  
  772.     
  773.     def get_data(self):
  774.         return self._data
  775.  
  776.     
  777.     def rawData(self):
  778.         return self._name + self._parameters + self._data
  779.  
  780.  
  781.  
  782. class SMBCommand(Structure):
  783.     structure = (('WordCount', 'B=len(Parameters)/2'), ('_ParametersLength', '_-Parameters', 'WordCount*2'), ('Parameters', ':'), ('ByteCount', '<H-Data'), ('Data', ':'))
  784.     
  785.     def __init__(self, commandOrData = None, data = None, **kargs):
  786.         if type(commandOrData) == type(0):
  787.             self.command = commandOrData
  788.         elif not data:
  789.             pass
  790.         data = commandOrData
  791.         Structure.__init__(self, data = data, **kargs)
  792.         if data is None:
  793.             self['Parameters'] = ''
  794.             self['Data'] = ''
  795.         
  796.  
  797.  
  798.  
  799. class AsciiOrUnicodeStructure(Structure):
  800.     
  801.     def __init__(self, flags = 0, **kargs):
  802.         if flags & SMB.FLAGS2_UNICODE:
  803.             self.structure = self.UnicodeStructure
  804.         else:
  805.             self.structure = self.AsciiStructure
  806.         return Structure.__init__(self, **kargs)
  807.  
  808.  
  809.  
  810. class SMBCommand_Parameters(Structure):
  811.     pass
  812.  
  813.  
  814. class SMBAndXCommand_Parameters(Structure):
  815.     commonHdr = (('AndXCommand', 'B=0xff'), ('_reserved', 'B=0'), ('AndXOffset', '<H=0'))
  816.     structure = (('Data', ':=""'),)
  817.  
  818.  
  819. class SMBSessionSetupAndX_Parameters(SMBAndXCommand_Parameters):
  820.     structure = (('MaxBuffer', '<H'), ('MaxMpxCount', '<H'), ('VCNumber', '<H'), ('SessionKey', '<L'), ('AnsiPwdLength', '<H'), ('UnicodePwdLength', '<H'), ('_reserved', '<L=0'), ('Capabilities', '<L'))
  821.  
  822.  
  823. class SMBSessionSetupAndX_Data(AsciiOrUnicodeStructure):
  824.     AsciiStructure = (('AnsiPwdLength', '_-AnsiPwd'), ('UnicodePwdLength', '_-UnicodePwd'), ('AnsiPwd', ':=""'), ('UnicodePwd', ':=""'), ('Account', 'z=""'), ('PrimaryDomain', 'z=""'), ('NativeOS', 'z=""'), ('NativeLanMan', 'z=""'))
  825.     UnicodeStructure = (('AnsiPwdLength', '_-AnsiPwd'), ('UnicodePwdLength', '_-UnicodePwd'), ('AnsiPwd', ':=""'), ('UnicodePwd', ':=""'), ('Account', 'w=""'), ('PrimaryDomain', 'w=""'), ('NativeOS', 'w=""'), ('NativeLanMan', 'w=""'))
  826.  
  827.  
  828. class SMBSessionSetupAndXResponse_Parameters(SMBAndXCommand_Parameters):
  829.     structure = (('Action', '<H'),)
  830.  
  831.  
  832. class SMBSessionSetupAndXResponse_Data(AsciiOrUnicodeStructure):
  833.     AsciiStructure = (('NativeOS', 'z=""'), ('NativeLanMan', 'z=""'), ('PrimaryDomain', 'z=""'))
  834.     UnicodeStructure = (('NativeOS', 'w=""'), ('NativeLanMan', 'w=""'), ('PrimaryDomain', 'w=""'))
  835.  
  836.  
  837. class SMBTreeConnect_Parameters(SMBCommand_Parameters):
  838.     structure = ()
  839.  
  840.  
  841. class SMBTreeConnect_Data(SMBCommand_Parameters):
  842.     structure = (('PathFormat', '"\x04'), ('Path', 'z'), ('PasswordFormat', '"\x04'), ('Password', 'z'), ('ServiceFormat', '"\x04'), ('Service', 'z'))
  843.  
  844.  
  845. class SMBTreeConnectAndX_Parameters(SMBAndXCommand_Parameters):
  846.     structure = (('Flags', '<H=0'), ('PasswordLength', '<H'))
  847.  
  848.  
  849. class SMBTreeConnectAndX_Data(SMBCommand_Parameters):
  850.     structure = (('_PasswordLength', '_-Password'), ('Password', ':'), ('Path', 'z'), ('Service', 'z'))
  851.  
  852.  
  853. class SMBNtCreateAndX_Parameters(SMBAndXCommand_Parameters):
  854.     structure = (('_reserved', 'B=0'), ('FileNameLength', '<H'), ('CreateFlags', '<L'), ('RootFid', '<L=0'), ('AccessMask', '<L'), ('AllocationSizeLo', '<L=0'), ('AllocationSizeHi', '<L=0'), ('FileAttributes', '<L=0'), ('ShareAccess', '<L=3'), ('Disposition', '<L=1'), ('CreateOptions', '<L'), ('Impersonation', '<L=2'), ('SecurityFlags', 'B=3'))
  855.  
  856.  
  857. class SMBNtCreateAndXResponse_Parameters(SMBAndXCommand_Parameters):
  858.     structure = (('OplockLevel', 'B=0'), ('Fid', '<H'), ('CreateAction', '<L'), ('CraetionTimeLo', '<L=0'), ('CraetionTimeHi', '<L=0'), ('AccessTimeLo', '<L=0'), ('AccessTimeHi', '<L=0'), ('LastWriteTimeLo', '<L=0'), ('LastWriteTimeHi', '<L=0'), ('ChangeTimeLo', '<L=0'), ('ChangeTimeHi', '<L=0'), ('FileAttributes', '<L=0x80'), ('AllocationSizeLo', '<L=0'), ('AllocationSizeHi', '<L=0'), ('EndOfFileLo', '<L=0'), ('EndOfFileHi', '<L=0'), ('FileType', '<H=0'), ('IPCState', '<H=0'), ('IsDirectory', 'B'))
  859.  
  860.  
  861. class SMBNtCreateAndX_Data(Structure):
  862.     structure = (('FileName', 'z'),)
  863.  
  864.  
  865. class SMBOpenAndX_Parameters(SMBAndXCommand_Parameters):
  866.     structure = (('Flags', '<H=0'), ('DesiredAccess', '<H=0'), ('SearchAttributes', '<H=0'), ('FileAttributes', '<H=0'), ('CreationTime', '<L=0'), ('OpenMode', '<H=1'), ('AllocationSize', '<L=0'), ('Reserved', '8s=""'))
  867.  
  868.  
  869. class SMBOpenAndX_Data(SMBNtCreateAndX_Data):
  870.     pass
  871.  
  872.  
  873. class SMBOpenAndXResponse_Parameters(SMBAndXCommand_Parameters):
  874.     structure = (('Fid', '<H=0'), ('FileAttributes', '<H=0'), ('LastWriten', '<L=0'), ('FileSize', '<L=0'), ('GrantedAccess', '<H=0'), ('FileType', '<H=0'), ('IPCState', '<H=0'), ('Action', '<H=0'), ('ServerFid', '<L=0'), ('_reserved', '<H=0'))
  875.  
  876.  
  877. class SMBWrite_Parameters(SMBCommand_Parameters):
  878.     structure = (('Fid', '<H'), ('Count', '<H'), ('Offset', '<L'), ('Remaining', '<H'))
  879.  
  880.  
  881. class SMBWrite_Data(Structure):
  882.     structure = (('BufferFormat', '<B=1'), ('DataLength', '<H-Data'), ('Data', ':'))
  883.  
  884.  
  885. class SMBWriteAndX_Parameters(SMBAndXCommand_Parameters):
  886.     structure = (('Fid', '<H'), ('Offset', '<L'), ('_reserved', '<L=0xff'), ('WriteMode', '<H=8'), ('Remaining', '<H'), ('DataLength_Hi', '<H=0'), ('DataLength', '<H'), ('DataOffset', '<H=0'), ('HighOffset', '<L=0'))
  887.  
  888.  
  889. class SMBWriteRaw_Parameters(SMBCommand_Parameters):
  890.     structure = (('Fid', '<H'), ('Count', '<H'), ('_reserved', '<H=0'), ('Offset', '<L'), ('Timeout', '<L=0'), ('WriteMode', '<H=0'), ('_reserved2', '<L=0'), ('DataLength', '<H'), ('DataOffset', '<H=0'))
  891.  
  892.  
  893. class SMBRead_Parameters(SMBCommand_Parameters):
  894.     structure = (('Fid', '<H'), ('Count', '<H'), ('Offset', '<L'), ('Remaining', '<H=Count'))
  895.  
  896.  
  897. class SMBReadResponse_Parameters(Structure):
  898.     structure = (('Count', '<H=0'), ('_reserved', '"\x00\x00\x00\x00\x00\x00\x00\x00'))
  899.  
  900.  
  901. class SMBReadResponse_Data(Structure):
  902.     structure = (('BufferFormat', '<B'), ('DataLength', '<H-Data'), ('Data', ':'))
  903.  
  904.  
  905. class SMBReadRaw_Parameters(SMBCommand_Parameters):
  906.     structure = (('Fid', '<H'), ('Offset', '<L'), ('MaxCount', '<H'), ('MinCount', '<H=MaxCount'), ('Timeout', '<L=0'), ('_reserved', '<H=0'))
  907.  
  908.  
  909. class SMBReadAndX_Parameters(SMBAndXCommand_Parameters):
  910.     structure = (('Fid', '<H'), ('Offset', '<L'), ('MaxCount', '<H'), ('MinCount', '<H=MaxCount'), ('_reserved', '<L=0xffffffff'), ('Remaining', '<H=MaxCount'), ('HighOffset', '<L=0'))
  911.  
  912.  
  913. class SMBReadAndXResponse_Parameters(SMBAndXCommand_Parameters):
  914.     structure = (('Remaining', '<H=0'), ('DataMode', '<H=0'), ('_reserved', '<H=0'), ('DataCount', '<H'), ('DataOffset', '<H'), ('DataCount_Hi', '<L'), ('_reserved2', '"\x00\x00\x00\x00\x00\x00'))
  915.  
  916.  
  917. class SMBOpen_Parameters(SMBCommand_Parameters):
  918.     structure = (('DesiredAccess', '<H=0'), ('SearchAttributes', '<H=0'))
  919.  
  920.  
  921. class SMBOpen_Data(Structure):
  922.     structure = (('FileNameFormat', '"\x04'), ('FileName', 'z'))
  923.  
  924.  
  925. class SMBOpenResponse_Parameters(SMBCommand_Parameters):
  926.     structure = (('Fid', '<H=0'), ('FileAttributes', '<H=0'), ('LastWriten', '<L=0'), ('FileSize', '<L=0'), ('GrantedAccess', '<H=0'))
  927.  
  928.  
  929. class NTLMDialect(SMBPacket):
  930.     
  931.     def __init__(self, data = ''):
  932.         SMBPacket.__init__(self, data)
  933.         self._selected_dialect = 0
  934.         self._security_mode = 0
  935.         self._max_mpx = 0
  936.         self._max_vc = 0
  937.         self._max_buffer = 0
  938.         self._max_raw = 0
  939.         self._session_key = 0
  940.         self._lsw_capabilities = 0
  941.         self._msw_capabilities = 0
  942.         self._utc_high = 0
  943.         self._utc_low = 0
  944.         self._minutes_utc = 0
  945.         self._encryption_key_len = 0
  946.         self._encryption_key = ''
  947.         self._server_domain = ''
  948.         self._server_name = ''
  949.         if data:
  950.             (self._selected_dialect, self._security_mode, self._max_mpx, self._max_vc) = unpack('<HBHH', self.get_parameter_words()[:7])
  951.             (self._max_buffer, self._max_raw, self._session_key, self._lsw_capabilities, self._msw_capabilities) = unpack('<lllHH', self.get_parameter_words()[7:16 + 7])
  952.             (self._utc_low, self._utc_high, self._minutes_utc, self._encryption_key_len) = unpack('<LLhB', self.get_parameter_words()[23:34])
  953.             if self._encryption_key_len > 0 and len(self.get_buffer()) >= self._encryption_key_len:
  954.                 self._encryption_key = self.get_buffer()[:self._encryption_key_len]
  955.                 buf = self.get_buffer()
  956.                 self._server_name = '<Unknown>'
  957.                 self._server_domain = '<Unknown>'
  958.                 
  959.                 try:
  960.                     if self._lsw_capabilities & 3:
  961.                         offset = self._encryption_key_len
  962.                         if offset & 1:
  963.                             offset += 1
  964.                         
  965.                         end = offset
  966.                         while ord(buf[end]) or ord(buf[end + 1]):
  967.                             end += 2
  968.                         self._server_domain = unicode(buf[offset:end], 'utf_16_le')
  969.                         end += 2
  970.                         offset = end
  971.                         while ord(buf[end]) or ord(buf[end + 1]):
  972.                             end += 2
  973.                         self._server_name = unicode(buf[offset:end], 'utf_16_le')
  974.                     else:
  975.                         offset = self._encryption_key_len
  976.                         idx1 = string.find(buf, '\x00', offset)
  977.                         if idx1 != -1:
  978.                             self._server_domain = buf[offset:idx1]
  979.                             idx2 = string.find(buf, '\x00', idx1 + 1)
  980.                             if idx2 != -1:
  981.                                 self._server_name = buf[idx1 + 1:idx2]
  982.                             
  983.  
  984.             else:
  985.                 self._encryption_key = ''
  986.         
  987.  
  988.     
  989.     def get_selected_dialect(self):
  990.         return self._selected_dialect
  991.  
  992.     
  993.     def get_security_mode(self):
  994.         return self._security_mode
  995.  
  996.     
  997.     def get_max_mpx(self):
  998.         return self._max_mpx
  999.  
  1000.     
  1001.     def get_max_vc(self):
  1002.         return self._max_vc
  1003.  
  1004.     
  1005.     def get_max_buffer(self):
  1006.         return self._max_buffer
  1007.  
  1008.     
  1009.     def get_max_raw(self):
  1010.         return self._max_raw
  1011.  
  1012.     
  1013.     def get_session_key(self):
  1014.         return self._session_key
  1015.  
  1016.     
  1017.     def get_lsw_capabilities(self):
  1018.         return self._lsw_capabilities
  1019.  
  1020.     
  1021.     def get_msw_capabilities(self):
  1022.         return self._msw_capabilities
  1023.  
  1024.     
  1025.     def get_utc(self):
  1026.         return (self._utc_high, self._utc_low)
  1027.  
  1028.     
  1029.     def get_minutes_utc(self):
  1030.         return self._minutes_utc
  1031.  
  1032.     
  1033.     def get_encryption_key_len(self):
  1034.         return self._encryption_key_len
  1035.  
  1036.     
  1037.     def get_encryption_key(self):
  1038.         return self._encryption_key
  1039.  
  1040.     
  1041.     def get_server_domain(self):
  1042.         return self._server_domain
  1043.  
  1044.     
  1045.     def get_server_name(self):
  1046.         return self._server_name
  1047.  
  1048.     
  1049.     def is_auth_mode(self):
  1050.         return self._security_mode & SMB.SECURITY_AUTH_MASK
  1051.  
  1052.     
  1053.     def is_share_mode(self):
  1054.         return self._security_mode & SMB.SECURITY_SHARE_MASK
  1055.  
  1056.     
  1057.     def is_rawmode(self):
  1058.         return self._lsw_capabilities & SMB.CAP_RAW_MODE
  1059.  
  1060.  
  1061.  
  1062. class SMB:
  1063.     SMB_COM_CREATE_DIRECTORY = 0
  1064.     SMB_COM_DELETE_DIRECTORY = 1
  1065.     SMB_COM_OPEN = 2
  1066.     SMB_COM_CREATE = 3
  1067.     SMB_COM_CLOSE = 4
  1068.     SMB_COM_FLUSH = 5
  1069.     SMB_COM_DELETE = 6
  1070.     SMB_COM_RENAME = 7
  1071.     SMB_COM_QUERY_INFORMATION = 8
  1072.     SMB_COM_SET_INFORMATION = 9
  1073.     SMB_COM_READ = 10
  1074.     SMB_COM_WRITE = 11
  1075.     SMB_COM_LOCK_BYTE_RANGE = 12
  1076.     SMB_COM_UNLOCK_BYTE_RANGE = 13
  1077.     SMB_COM_CREATE_TEMPORARY = 14
  1078.     SMB_COM_CREATE_NEW = 15
  1079.     SMB_COM_CHECK_DIRECTORY = 16
  1080.     SMB_COM_PROCESS_EXIT = 17
  1081.     SMB_COM_SEEK = 18
  1082.     SMB_COM_LOCK_AND_READ = 19
  1083.     SMB_COM_WRITE_AND_UNLOCK = 20
  1084.     SMB_COM_READ_RAW = 26
  1085.     SMB_COM_READ_MPX = 27
  1086.     SMB_COM_READ_MPX_SECONDARY = 28
  1087.     SMB_COM_WRITE_RAW = 29
  1088.     SMB_COM_WRITE_MPX = 30
  1089.     SMB_COM_WRITE_MPX_SECONDARY = 31
  1090.     SMB_COM_WRITE_COMPLETE = 32
  1091.     SMB_COM_QUERY_SERVER = 33
  1092.     SMB_COM_SET_INFORMATION2 = 34
  1093.     SMB_COM_QUERY_INFORMATION2 = 35
  1094.     SMB_COM_LOCKING_ANDX = 36
  1095.     SMB_COM_TRANSACTION = 37
  1096.     SMB_COM_TRANSACTION_SECONDARY = 38
  1097.     SMB_COM_IOCTL = 39
  1098.     SMB_COM_IOCTL_SECONDARY = 40
  1099.     SMB_COM_COPY = 41
  1100.     SMB_COM_MOVE = 42
  1101.     SMB_COM_ECHO = 43
  1102.     SMB_COM_WRITE_AND_CLOSE = 44
  1103.     SMB_COM_OPEN_ANDX = 45
  1104.     SMB_COM_READ_ANDX = 46
  1105.     SMB_COM_WRITE_ANDX = 47
  1106.     SMB_COM_NEW_FILE_SIZE = 48
  1107.     SMB_COM_CLOSE_AND_TREE_DISC = 49
  1108.     SMB_COM_TRANSACTION2 = 50
  1109.     SMB_COM_TRANSACTION2_SECONDARY = 51
  1110.     SMB_COM_FIND_CLOSE2 = 52
  1111.     SMB_COM_FIND_NOTIFY_CLOSE = 53
  1112.     SMB_COM_TREE_CONNECT = 112
  1113.     SMB_COM_TREE_DISCONNECT = 113
  1114.     SMB_COM_NEGOTIATE = 114
  1115.     SMB_COM_SESSION_SETUP_ANDX = 115
  1116.     SMB_COM_LOGOFF_ANDX = 116
  1117.     SMB_COM_TREE_CONNECT_ANDX = 117
  1118.     SMB_COM_QUERY_INFORMATION_DISK = 128
  1119.     SMB_COM_SEARCH = 129
  1120.     SMB_COM_FIND = 130
  1121.     SMB_COM_FIND_UNIQUE = 131
  1122.     SMB_COM_FIND_CLOSE = 132
  1123.     SMB_COM_NT_TRANSACT = 160
  1124.     SMB_COM_NT_TRANSACT_SECONDARY = 161
  1125.     SMB_COM_NT_CREATE_ANDX = 162
  1126.     SMB_COM_NT_CANCEL = 164
  1127.     SMB_COM_NT_RENAME = 165
  1128.     SMB_COM_OPEN_PRINT_FILE = 192
  1129.     SMB_COM_WRITE_PRINT_FILE = 193
  1130.     SMB_COM_CLOSE_PRINT_FILE = 194
  1131.     SMB_COM_GET_PRINT_QUEUE = 195
  1132.     SMB_COM_READ_BULK = 216
  1133.     SMB_COM_WRITE_BULK = 217
  1134.     SMB_COM_WRITE_BULK_DATA = 218
  1135.     SECURITY_SHARE_MASK = 1
  1136.     SECURITY_SHARE_SHARE = 0
  1137.     SECURITY_SHARE_USER = 1
  1138.     SECURITY_AUTH_MASK = 2
  1139.     SECURITY_AUTH_ENCRYPTED = 2
  1140.     SECURITY_AUTH_PLAINTEXT = 0
  1141.     RAW_READ_MASK = 1
  1142.     RAW_WRITE_MASK = 2
  1143.     CAP_RAW_MODE = 1
  1144.     CAP_MPX_MODE = 2
  1145.     CAP_UNICODE = 4
  1146.     CAP_LARGE_FILES = 8
  1147.     CAP_EXTENDED_SECURITY = 0x80000000L
  1148.     FLAGS1_PATHCASELESS = 8
  1149.     FLAGS2_LONG_FILENAME = 1
  1150.     FLAGS2_USE_NT_ERRORS = 16384
  1151.     FLAGS2_UNICODE = 32768
  1152.     
  1153.     def __init__(self, remote_name, remote_host, my_name = None, host_type = nmb.TYPE_SERVER, sess_port = nmb.NETBIOS_SESSION_PORT, timeout = None):
  1154.         self._SMB__uid = 0
  1155.         self._SMB__server_os = ''
  1156.         self._SMB__server_lanman = ''
  1157.         self._SMB__server_domain = ''
  1158.         self._SMB__remote_name = string.upper(remote_name)
  1159.         self._SMB__is_pathcaseless = 0
  1160.         self._SMB__ntlm_dialect = 0
  1161.         self._SMB__sess = None
  1162.         if timeout == None:
  1163.             self._SMB__timeout = 30
  1164.         else:
  1165.             self._SMB__timeout = timeout
  1166.         if not my_name:
  1167.             my_name = socket.gethostname()
  1168.             i = string.find(my_name, '.')
  1169.             if i > -1:
  1170.                 my_name = my_name[:i]
  1171.             
  1172.         
  1173.         
  1174.         try:
  1175.             self._SMB__sess = nmb.NetBIOSSession(my_name, remote_name, remote_host, host_type, sess_port, timeout)
  1176.         except socket.error:
  1177.             ex = None
  1178.             raise ex
  1179.  
  1180.         self._SMB__neg_session()
  1181.         if not self._SMB__ntlm_dialect.is_auth_mode() == SMB.SECURITY_AUTH_PLAINTEXT:
  1182.             if not self._SMB__ntlm_dialect.is_auth_mode() == SMB.SECURITY_AUTH_ENCRYPTED and self._SMB__ntlm_dialect.get_encryption_key() or self._SMB__ntlm_dialect.get_encryption_key_len() >= 8:
  1183.                 raise AssertionError
  1184.         if self._SMB__ntlm_dialect.is_share_mode() == SMB.SECURITY_SHARE_SHARE:
  1185.             self.login('', '')
  1186.         
  1187.  
  1188.     
  1189.     def set_timeout(self, timeout):
  1190.         self._SMB__timeout = timeout
  1191.  
  1192.     
  1193.     def __del__(self):
  1194.         if self._SMB__sess:
  1195.             self._SMB__sess.close()
  1196.         
  1197.  
  1198.     
  1199.     def __decode_smb(self, data):
  1200.         (_, cmd, err_class, _, err_code, flags1, flags2, _, tid, pid, uid, mid, wcount) = unpack('<4sBBBHBH12sHHHHB', data[:33])
  1201.         param_end = 33 + wcount * 2
  1202.         return (cmd, err_class, err_code, flags1, flags2, tid, uid, mid, data[33:param_end], data[param_end + 2:])
  1203.  
  1204.     
  1205.     def recvSMB(self):
  1206.         r = self._SMB__sess.recv_packet(self._SMB__timeout)
  1207.         return NewSMBPacket(data = r.get_trailer())
  1208.  
  1209.     
  1210.     def recv_packet(self):
  1211.         r = self._SMB__sess.recv_packet(self._SMB__timeout)
  1212.         return SMBPacket(r.get_trailer())
  1213.  
  1214.     
  1215.     def __decode_trans(self, params, data):
  1216.         (totparamcnt, totdatacnt, _, paramcnt, paramoffset, paramds, datacnt, dataoffset, datads, setupcnt) = unpack('<HHHHHHHHHB', params[:19])
  1217.         if paramcnt + paramds < totparamcnt or datacnt + datads < totdatacnt:
  1218.             has_more = 1
  1219.         else:
  1220.             has_more = 0
  1221.         paramoffset = paramoffset - 55 - setupcnt * 2
  1222.         dataoffset = dataoffset - 55 - setupcnt * 2
  1223.         return (has_more, params[20:20 + setupcnt * 2], data[paramoffset:paramoffset + paramcnt], data[dataoffset:dataoffset + datacnt])
  1224.  
  1225.     
  1226.     def sendSMB(self, smb):
  1227.         smb['Uid'] = self._SMB__uid
  1228.         smb['Pid'] = os.getpid()
  1229.         self._SMB__sess.send_packet(str(smb))
  1230.  
  1231.     
  1232.     def send_smb(self, s):
  1233.         s.set_uid(self._SMB__uid)
  1234.         s.set_pid(os.getpid())
  1235.         self._SMB__sess.send_packet(s.rawData())
  1236.  
  1237.     
  1238.     def __send_smb_packet(self, cmd, flags, flags2, tid, mid, params = '', data = ''):
  1239.         smb = NewSMBPacket()
  1240.         smb['Flags'] = flags
  1241.         smb['Flags2'] = flags2
  1242.         smb['Tid'] = tid
  1243.         smb['Mid'] = mid
  1244.         cmd = SMBCommand(cmd)
  1245.         smb.addCommand(cmd)
  1246.         cmd['Parameters'] = params
  1247.         cmd['Data'] = data
  1248.         self.sendSMB(smb)
  1249.  
  1250.     
  1251.     def isValidAnswer(self, s, cmd):
  1252.         while s.rawData():
  1253.             if s.get_command() == cmd:
  1254.                 if s.get_error_class() == 0 and s.get_error_code() == 0:
  1255.                     return 1
  1256.                 else:
  1257.                     raise SessionError, ('SMB Library Error', s.get_error_class(), s.get_error_code())
  1258.             else:
  1259.                 break
  1260.             s.get_command() == cmd
  1261.         return 0
  1262.  
  1263.     
  1264.     def __neg_session(self):
  1265.         s = SMBPacket()
  1266.         s.set_command(SMB.SMB_COM_NEGOTIATE)
  1267.         s.set_buffer('\x02NT LM 0.12\x00')
  1268.         self.send_smb(s)
  1269.         while None:
  1270.             s = self.recv_packet()
  1271.             if self.isValidAnswer(s, SMB.SMB_COM_NEGOTIATE):
  1272.                 self._SMB__ntlm_dialect = NTLMDialect(s.rawData())
  1273.                 if self._SMB__ntlm_dialect.get_selected_dialect() == 65535:
  1274.                     raise UnsupportedFeature, 'Remote server does not know NT LM 0.12'
  1275.                 
  1276.                 if self._SMB__ntlm_dialect.get_lsw_capabilities() & SMB.CAP_EXTENDED_SECURITY:
  1277.                     raise UnsupportedFeature, 'This version of pysmb does not support extended security validation. Please file a request for it.'
  1278.                 
  1279.                 self._SMB__is_pathcaseless = s.get_flags() & SMB.FLAGS1_PATHCASELESS
  1280.                 return 1
  1281.                 continue
  1282.             return 0
  1283.  
  1284.     
  1285.     def tree_connect(self, path, password = '', service = SERVICE_ANY):
  1286.         if password:
  1287.             if self._SMB__ntlm_dialect.get_encryption_key():
  1288.                 password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
  1289.             
  1290.         
  1291.         if not unicode_support:
  1292.             if unicode_convert:
  1293.                 path = str(path)
  1294.             else:
  1295.                 raise Except('SMB: Can\t conver path from unicode!')
  1296.         
  1297.         smb = NewSMBPacket()
  1298.         smb['Flags1'] = 8
  1299.         treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT)
  1300.         treeConnect['Parameters'] = SMBTreeConnect_Parameters()
  1301.         treeConnect['Data'] = SMBTreeConnect_Data()
  1302.         treeConnect['Data']['Path'] = path.upper()
  1303.         treeConnect['Data']['Password'] = password
  1304.         treeConnect['Data']['Service'] = service
  1305.         smb.addCommand(treeConnect)
  1306.         self.sendSMB(smb)
  1307.         while None:
  1308.             smb = self.recvSMB()
  1309.             if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT):
  1310.                 return smb['Tid']
  1311.             
  1312.             return smb['Tid']
  1313.  
  1314.     
  1315.     def tree_connect_andx(self, path, password = None, service = SERVICE_ANY):
  1316.         if password:
  1317.             if self._SMB__ntlm_dialect.get_encryption_key():
  1318.                 password = self.get_ntlmv1_response(ntlm.compute_lmhash(password))
  1319.             
  1320.         else:
  1321.             password = '\x00'
  1322.         if not unicode_support:
  1323.             if unicode_convert:
  1324.                 path = str(path)
  1325.             else:
  1326.                 raise Except('SMB: Can\t convert path from unicode!')
  1327.         
  1328.         smb = NewSMBPacket()
  1329.         smb['Flags1'] = 8
  1330.         treeConnect = SMBCommand(SMB.SMB_COM_TREE_CONNECT_ANDX)
  1331.         treeConnect['Parameters'] = SMBTreeConnectAndX_Parameters()
  1332.         treeConnect['Data'] = SMBTreeConnectAndX_Data()
  1333.         treeConnect['Parameters']['PasswordLength'] = len(password)
  1334.         treeConnect['Data']['Password'] = password
  1335.         treeConnect['Data']['Path'] = path.upper()
  1336.         treeConnect['Data']['Service'] = service
  1337.         smb.addCommand(treeConnect)
  1338.         self.sendSMB(smb)
  1339.         while None:
  1340.             smb = self.recvSMB()
  1341.             if smb.isValidAnswer(SMB.SMB_COM_TREE_CONNECT_ANDX):
  1342.                 return smb['Tid']
  1343.             
  1344.             return smb['Tid']
  1345.  
  1346.     connect_tree = tree_connect_andx
  1347.     
  1348.     def get_server_name(self):
  1349.         return self._SMB__ntlm_dialect.get_server_name()
  1350.  
  1351.     
  1352.     def get_session_key(self):
  1353.         return self._SMB__ntlm_dialect.get_session_key()
  1354.  
  1355.     
  1356.     def get_server_time(self):
  1357.         (high, low) = self._SMB__ntlm_dialect.get_utc()
  1358.         min = self._SMB__ntlm_dialect.get_minutes_utc()
  1359.         return samr.display_time(high, low, min)
  1360.  
  1361.     
  1362.     def disconnect_tree(self, tid):
  1363.         smb = NewSMBPacket()
  1364.         smb['Tid'] = tid
  1365.         smb.addCommand(SMBCommand(SMB.SMB_COM_TREE_DISCONNECT))
  1366.         self.sendSMB(smb)
  1367.         smb = self.recvSMB()
  1368.  
  1369.     
  1370.     def open(self, tid, filename, open_mode, desired_access):
  1371.         smb = NewSMBPacket()
  1372.         smb['Flags'] = 8
  1373.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1374.         smb['Tid'] = tid
  1375.         openFile = SMBCommand(SMB.SMB_COM_OPEN)
  1376.         openFile['Parameters'] = SMBOpen_Parameters()
  1377.         openFile['Parameters']['DesiredAccess'] = desired_access
  1378.         openFile['Parameters']['OpenMode'] = open_mode
  1379.         openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
  1380.         openFile['Data'] = SMBOpen_Data()
  1381.         openFile['Data']['FileName'] = filename
  1382.         smb.addCommand(openFile)
  1383.         self.sendSMB(smb)
  1384.         smb = self.recvSMB()
  1385.         if smb.isValidAnswer(SMB.SMB_COM_OPEN):
  1386.             openFileResponse = SMBCommand(smb['Data'][0])
  1387.             openFileParameters = SMBOpenResponse_Parameters(openFileResponse['Parameters'])
  1388.             return (openFileParameters['Fid'], openFileParameters['FileAttributes'], openFileParameters['LastWriten'], openFileParameters['FileSize'], openFileParameters['GrantedAccess'])
  1389.         
  1390.  
  1391.     
  1392.     def open_andx(self, tid, filename, open_mode, desired_access):
  1393.         smb = NewSMBPacket()
  1394.         smb['Flags'] = 8
  1395.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1396.         smb['Tid'] = tid
  1397.         openFile = SMBCommand(SMB.SMB_COM_OPEN_ANDX)
  1398.         openFile['Parameters'] = SMBOpenAndX_Parameters()
  1399.         openFile['Parameters']['DesiredAccess'] = desired_access
  1400.         openFile['Parameters']['OpenMode'] = open_mode
  1401.         openFile['Parameters']['SearchAttributes'] = ATTR_READONLY | ATTR_HIDDEN | ATTR_ARCHIVE
  1402.         openFile['Data'] = SMBOpenAndX_Data()
  1403.         openFile['Data']['FileName'] = filename
  1404.         smb.addCommand(openFile)
  1405.         self.sendSMB(smb)
  1406.         smb = self.recvSMB()
  1407.         if smb.isValidAnswer(SMB.SMB_COM_OPEN_ANDX):
  1408.             openFileResponse = SMBCommand(smb['Data'][0])
  1409.             openFileParameters = SMBOpenAndXResponse_Parameters(openFileResponse['Parameters'])
  1410.             return (openFileParameters['Fid'], openFileParameters['FileAttributes'], openFileParameters['LastWriten'], openFileParameters['FileSize'], openFileParameters['GrantedAccess'], openFileParameters['FileType'], openFileParameters['IPCState'], openFileParameters['Action'], openFileParameters['ServerFid'])
  1411.         
  1412.  
  1413.     
  1414.     def close(self, tid, fid):
  1415.         s = SMBPacket()
  1416.         s.set_command(SMB.SMB_COM_CLOSE)
  1417.         s.set_tid(tid)
  1418.         s.set_parameter_words(pack('<HL', fid, 0))
  1419.         self.send_smb(s)
  1420.         s = self.recv_packet()
  1421.  
  1422.     
  1423.     def send_trans(self, tid, setup, name, param, data, noAnswer = 0):
  1424.         t = TRANSHeader()
  1425.         s = SMBPacket()
  1426.         s.set_tid(tid)
  1427.         s.set_command(SMB.SMB_COM_TRANSACTION)
  1428.         s.set_flags(self._SMB__is_pathcaseless)
  1429.         s.set_flags2(SMB.FLAGS2_LONG_FILENAME)
  1430.         t.set_setup(setup)
  1431.         t.set_name(name)
  1432.         t.set_parameters(param)
  1433.         t.set_data(data)
  1434.         t.set_max_param_count(1024)
  1435.         t.set_max_data_count(65504)
  1436.         if noAnswer:
  1437.             t.set_flags(TRANS_NO_RESPONSE)
  1438.         
  1439.         s.set_parameter_words(t.get_rawParameters())
  1440.         s.set_buffer(t.rawData())
  1441.         self.send_smb(s)
  1442.  
  1443.     
  1444.     def __trans(self, tid, setup, name, param, data):
  1445.         data_len = len(data)
  1446.         name_len = len(name)
  1447.         param_len = len(param)
  1448.         setup_len = len(setup)
  1449.         if not setup_len & 1 == 0:
  1450.             raise AssertionError
  1451.         param_offset = name_len + setup_len + 63
  1452.         data_offset = param_offset + param_len
  1453.         self._SMB__send_smb_packet(SMB.SMB_COM_TRANSACTION, self._SMB__is_pathcaseless, SMB.FLAGS2_LONG_FILENAME, tid, 0, pack('<HHHHBBHLHHHHHBB', param_len, data_len, 1024, 65504, 0, 0, 0, 0, 0, param_len, param_offset, data_len, data_offset, setup_len / 2, 0) + setup, name + param + data)
  1454.  
  1455.     
  1456.     def trans2(self, tid, setup, name, param, data):
  1457.         data_len = len(data)
  1458.         name_len = len(name)
  1459.         param_len = len(param)
  1460.         setup_len = len(setup)
  1461.         if not setup_len & 1 == 0:
  1462.             raise AssertionError
  1463.         param_offset = name_len + setup_len + 63
  1464.         data_offset = param_offset + param_len
  1465.         self._SMB__send_smb_packet(SMB.SMB_COM_TRANSACTION2, self._SMB__is_pathcaseless, SMB.FLAGS2_LONG_FILENAME, tid, 0, pack('<HHHHBBHLHHHHHBB', param_len, data_len, 1024, self._SMB__ntlm_dialect.get_max_buffer(), 0, 0, 0, 0, 0, param_len, param_offset, data_len, data_offset, setup_len / 2, 0) + setup, name + param + data)
  1466.  
  1467.     
  1468.     def query_file_info(self, tid, fid):
  1469.         self.trans2(tid, '\x07\x00', '\x00', pack('<HH', fid, 263), '')
  1470.         while None:
  1471.             s = self.recv_packet()
  1472.             if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION2):
  1473.                 (f1, f2) = unpack('<LL', s.get_buffer()[53:53 + 8])
  1474.                 return (f2 & 0xFFFFFFFFL) << 32 | f1
  1475.                 continue
  1476.  
  1477.     
  1478.     def __nonraw_retr_file(self, tid, fid, offset, datasize, callback):
  1479.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1480.         read_offset = offset
  1481.         while read_offset < datasize:
  1482.             data = self.read_andx(tid, fid, read_offset, max_buf_size)
  1483.             callback(data)
  1484.             read_offset += len(data)
  1485.  
  1486.     
  1487.     def __raw_retr_file(self, tid, fid, offset, datasize, callback):
  1488.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1489.         read_offset = offset
  1490.         while read_offset < datasize:
  1491.             data = self.read_raw(tid, fid, read_offset, 65535)
  1492.             if not data:
  1493.                 data = self.read_andx(tid, fid, read_offset, max_buf_size)
  1494.             
  1495.             callback(data)
  1496.             read_offset += len(data)
  1497.  
  1498.     
  1499.     def __nonraw_stor_file(self, tid, fid, offset, datasize, callback):
  1500.         max_buf_size = self._SMB__ntlm_dialect.get_max_buffer() & -1024
  1501.         write_offset = offset
  1502.         while None:
  1503.             data = callback(max_buf_size)
  1504.             if not data:
  1505.                 break
  1506.             
  1507.             while None:
  1508.                 s = self.recv_packet()
  1509.                 if self.isValidAnswer(s, SMB.SMB_COM_WRITE_ANDX):
  1510.                     offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  1511.                     write_offset = write_offset + unpack('<H', s.get_parameter_words()[4:6])[0]
  1512.                     break
  1513.                     continue
  1514.  
  1515.     
  1516.     def __raw_stor_file(self, tid, fid, offset, datasize, callback):
  1517.         write_offset = offset
  1518.         while None:
  1519.             read_data = callback(65535)
  1520.             if not read_data:
  1521.                 break
  1522.             
  1523.             read_len = len(read_data)
  1524.             while None:
  1525.                 s = self.recv_packet()
  1526.                 if self.isValidAnswer(s, SMB.SMB_COM_WRITE_RAW):
  1527.                     self._SMB__sess.send_packet(read_data)
  1528.                     write_offset = write_offset + read_len
  1529.                     break
  1530.                     continue
  1531.         self._SMB__send_smb_packet(SMB.SMB_COM_CLOSE, 0, 0, tid, 0, pack('<HL', fid, 0), '')
  1532.         while None:
  1533.             s = self.recv_packet()
  1534.             if self.isValidAnswer(s, SMB.SMB_COM_CLOSE):
  1535.                 if s.get_error_class() == 0 and s.get_error_code() == 0:
  1536.                     return None
  1537.                 
  1538.  
  1539.     
  1540.     def __browse_servers(self, server_flags, container_type, domain):
  1541.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\IPC$')
  1542.         buf = StringIO()
  1543.         
  1544.         try:
  1545.             if server_flags & 0x80000000L:
  1546.                 self._SMB__trans(tid, '', '\\PIPE\\LANMAN\x00', 'h\x00WrLehDz\x00' + 'B16BBDz\x00\x01\x00\xff\xff\x00\x00\x00\x80', '')
  1547.             else:
  1548.                 self._SMB__trans(tid, '', '\\PIPE\\LANMAN\x00', 'h\x00WrLehDz\x00' + 'B16BBDz\x00\x01\x00\xff\xff' + pack('<l', server_flags) + domain + '\x00', '')
  1549.             servers = []
  1550.             entry_count = 0
  1551.             while None:
  1552.                 s = self.recv_packet()
  1553.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1554.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1555.                     if not entry_count:
  1556.                         (status, convert, entry_count, avail_entry) = unpack('<HHHH', transparam[:8])
  1557.                         if status and status != 234:
  1558.                             raise SessionError, ('Browse domains failed. (ErrClass: %d and ErrCode: %d)' % (128, status), 128, status)
  1559.                         
  1560.                     
  1561.                     buf.write(transdata)
  1562.                     if not has_more:
  1563.                         server_data = buf.getvalue()
  1564.                         for i in range(0, entry_count):
  1565.                             (server, _, server_type, comment_offset) = unpack('<16s2sll', server_data[i * 26:i * 26 + 26])
  1566.                             idx = string.find(server, '\x00')
  1567.                             idx2 = string.find(server_data, '\x00', comment_offset)
  1568.                             if idx < 0:
  1569.                                 server = server[:idx]
  1570.                             
  1571.                             servers.append(container_type(server, server_type, server_data[comment_offset:idx2]))
  1572.                         
  1573.                         return servers
  1574.                     
  1575.         finally:
  1576.             buf.close()
  1577.             self.disconnect_tree(tid)
  1578.  
  1579.  
  1580.     
  1581.     def get_server_domain(self):
  1582.         return self._SMB__server_domain
  1583.  
  1584.     
  1585.     def get_server_os(self):
  1586.         return self._SMB__server_os
  1587.  
  1588.     
  1589.     def get_server_lanman(self):
  1590.         return self._SMB__server_lanman
  1591.  
  1592.     
  1593.     def is_login_required(self):
  1594.         return self._SMB__ntlm_dialect.is_share_mode() == SMB.SECURITY_SHARE_USER
  1595.  
  1596.     
  1597.     def get_ntlmv1_response(self, key):
  1598.         challenge = self._SMB__ntlm_dialect.get_encryption_key()
  1599.         return ntlm.get_ntlmv1_response(key, challenge)
  1600.  
  1601.     
  1602.     def hmac_md5(self, key, data):
  1603.         import POW
  1604.         h = POW.Hmac(POW.MD5_DIGEST, key)
  1605.         h.update(data)
  1606.         result = h.mac()
  1607.         return result
  1608.  
  1609.     
  1610.     def get_ntlmv2_response(self, hash):
  1611.         '''
  1612.         blob = RandomBytes( blobsize );
  1613.         data = concat( ServerChallenge, 8, blob, blobsize );
  1614.         hmac = hmac_md5( v2hash, 16, data, (8 + blobsize) );
  1615.         v2resp = concat( hmac, 16, blob, blobsize );
  1616.         '''
  1617.         return ''
  1618.  
  1619.     
  1620.     def login(self, user, password, domain = '', lmhash = '', nthash = ''):
  1621.         if (password != '' or password == '') and lmhash == '' and nthash == '':
  1622.             self.login_plaintext_password(user, password)
  1623.         elif lmhash != '' or nthash != '':
  1624.             self.login_pass_the_hash(user, lmhash, nthash, domain)
  1625.         
  1626.  
  1627.     
  1628.     def _login(self, user, pwd_ansi, pwd_unicode, domain = ''):
  1629.         smb = NewSMBPacket()
  1630.         smb['Flags1'] = 8
  1631.         sessionSetup = SMBCommand(SMB.SMB_COM_SESSION_SETUP_ANDX)
  1632.         sessionSetup['Parameters'] = SMBSessionSetupAndX_Parameters()
  1633.         sessionSetup['Data'] = SMBSessionSetupAndX_Data()
  1634.         sessionSetup['Parameters']['MaxBuffer'] = 65535
  1635.         sessionSetup['Parameters']['MaxMpxCount'] = 2
  1636.         sessionSetup['Parameters']['VCNumber'] = os.getpid()
  1637.         sessionSetup['Parameters']['SessionKey'] = self._SMB__ntlm_dialect.get_session_key()
  1638.         sessionSetup['Parameters']['AnsiPwdLength'] = len(pwd_ansi)
  1639.         sessionSetup['Parameters']['UnicodePwdLength'] = len(pwd_unicode)
  1640.         sessionSetup['Parameters']['Capabilities'] = SMB.CAP_RAW_MODE
  1641.         sessionSetup['Data']['AnsiPwd'] = pwd_ansi
  1642.         sessionSetup['Data']['UnicodePwd'] = pwd_unicode
  1643.         sessionSetup['Data']['Account'] = str(user)
  1644.         sessionSetup['Data']['PrimaryDomain'] = str(domain)
  1645.         sessionSetup['Data']['NativeOS'] = str(os.name)
  1646.         sessionSetup['Data']['NativeLanMan'] = 'pysmb'
  1647.         smb.addCommand(sessionSetup)
  1648.         self.sendSMB(smb)
  1649.         smb = self.recvSMB()
  1650.         if smb.isValidAnswer(SMB.SMB_COM_SESSION_SETUP_ANDX):
  1651.             self._SMB__uid = smb['Uid']
  1652.             sessionResponse = SMBCommand(smb['Data'][0])
  1653.             sessionParameters = SMBSessionSetupAndXResponse_Parameters(sessionResponse['Parameters'])
  1654.             sessionData = SMBSessionSetupAndXResponse_Data(flags = smb['Flags2'], data = sessionResponse['Data'])
  1655.             self._SMB__server_os = sessionData['NativeOS']
  1656.             self._SMB__server_lanman = sessionData['NativeLanMan']
  1657.             self._SMB__server_domain = sessionData['PrimaryDomain']
  1658.             return 1
  1659.         else:
  1660.             raise Exception('Error: Could not login successfully')
  1661.  
  1662.     
  1663.     def read(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1664.         if not max_size:
  1665.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1666.         
  1667.         smb = NewSMBPacket()
  1668.         smb['Flags1'] = 24
  1669.         smb['Flags2'] = 0
  1670.         smb['Tid'] = tid
  1671.         read = SMBCommand(SMB.SMB_COM_READ)
  1672.         read['Parameters'] = SMBRead_Parameters()
  1673.         read['Parameters']['Fid'] = fid
  1674.         read['Parameters']['Offset'] = offset
  1675.         read['Parameters']['Count'] = max_size
  1676.         smb.addCommand(read)
  1677.         if wait_answer:
  1678.             answer = ''
  1679.             while None:
  1680.                 ans = self.recvSMB()
  1681.                 if ans.isValidAnswer(SMB.SMB_COM_READ):
  1682.                     readResponse = SMBCommand(ans['Data'][0])
  1683.                     readParameters = SMBReadResponse_Parameters(readResponse['Parameters'])
  1684.                     readData = SMBReadResponse_Data(readResponse['Data'])
  1685.                     return readData['Data']
  1686.                     continue
  1687.         
  1688.  
  1689.     
  1690.     def read_andx(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1691.         if not max_size:
  1692.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1693.         
  1694.         smb = NewSMBPacket()
  1695.         smb['Flags1'] = 24
  1696.         smb['Flags2'] = 0
  1697.         smb['Tid'] = tid
  1698.         readAndX = SMBCommand(SMB.SMB_COM_READ_ANDX)
  1699.         readAndX['Parameters'] = SMBReadAndX_Parameters()
  1700.         readAndX['Parameters']['Fid'] = fid
  1701.         readAndX['Parameters']['Offset'] = offset
  1702.         readAndX['Parameters']['MaxCount'] = max_size
  1703.         smb.addCommand(readAndX)
  1704.         if wait_answer:
  1705.             answer = ''
  1706.             while None:
  1707.                 ans = self.recvSMB()
  1708.                 if ans.isValidAnswer(SMB.SMB_COM_READ_ANDX):
  1709.                     readAndXResponse = SMBCommand(ans['Data'][0])
  1710.                     readAndXParameters = SMBReadAndXResponse_Parameters(readAndXResponse['Parameters'])
  1711.                     offset = readAndXParameters['DataOffset']
  1712.                     count = readAndXParameters['DataCount'] + 65536 * readAndXParameters['DataCount_Hi']
  1713.                     answer += str(ans)[offset:offset + count]
  1714.                     if not ans.isMoreData():
  1715.                         return answer
  1716.                     
  1717.                     max_size = min(max_size, readAndXParameters['Remaining'])
  1718.                     readAndX['Parameters']['Offset'] += count
  1719.                     continue
  1720.         
  1721.  
  1722.     
  1723.     def read_raw(self, tid, fid, offset = 0, max_size = None, wait_answer = 1):
  1724.         if not max_size:
  1725.             max_size = self._SMB__ntlm_dialect.get_max_buffer()
  1726.         
  1727.         smb = NewSMBPacket()
  1728.         smb['Flags1'] = 24
  1729.         smb['Flags2'] = 0
  1730.         smb['Tid'] = tid
  1731.         readRaw = SMBCommand(SMB.SMB_COM_READ_RAW)
  1732.         readRaw['Parameters'] = SMBReadRaw_Parameters()
  1733.         readRaw['Parameters']['Fid'] = fid
  1734.         readRaw['Parameters']['Offset'] = offset
  1735.         readRaw['Parameters']['MaxCount'] = max_size
  1736.         smb.addCommand(readRaw)
  1737.         self.sendSMB(smb)
  1738.         if wait_answer:
  1739.             data = self._SMB__sess.recv_packet(self._SMB__timeout).get_trailer()
  1740.             if not data:
  1741.                 data = self.read_andx(tid, fid, offset, max_size)
  1742.             
  1743.             return data
  1744.         
  1745.  
  1746.     
  1747.     def write(self, tid, fid, data, offset = 0, wait_answer = 1):
  1748.         smb = NewSMBPacket()
  1749.         smb['Flags1'] = 24
  1750.         smb['Flags2'] = 0
  1751.         smb['Tid'] = tid
  1752.         write = SMBCommand(SMB.SMB_COM_WRITE)
  1753.         smb.addCommand(write)
  1754.         write['Parameters'] = SMBWrite_Parameters()
  1755.         write['Data'] = SMBWrite_Data()
  1756.         write['Parameters']['Fid'] = fid
  1757.         write['Parameters']['Count'] = len(data)
  1758.         write['Parameters']['Offset'] = offset
  1759.         write['Parameters']['Remaining'] = len(data)
  1760.         write['Data']['Data'] = data
  1761.         self.sendSMB(smb)
  1762.         if wait_answer:
  1763.             smb = self.recvSMB()
  1764.             if smb.isValidAnswer(SMB.SMB_COM_WRITE):
  1765.                 return smb
  1766.             
  1767.         
  1768.  
  1769.     
  1770.     def write_andx(self, tid, fid, data, offset = 0, wait_answer = 1):
  1771.         smb = NewSMBPacket()
  1772.         smb['Flags1'] = 24
  1773.         smb['Flags2'] = 0
  1774.         smb['Tid'] = tid
  1775.         writeAndX = SMBCommand(SMB.SMB_COM_WRITE_ANDX)
  1776.         smb.addCommand(writeAndX)
  1777.         writeAndX['Parameters'] = SMBWriteAndX_Parameters()
  1778.         writeAndX['Parameters']['Fid'] = fid
  1779.         writeAndX['Parameters']['Offset'] = offset
  1780.         writeAndX['Parameters']['WriteMode'] = 8
  1781.         writeAndX['Parameters']['Remaining'] = len(data)
  1782.         writeAndX['Parameters']['DataLength'] = len(data)
  1783.         writeAndX['Parameters']['DataOffset'] = len(smb)
  1784.         writeAndX['Data'] = data
  1785.         self.sendSMB(smb)
  1786.         if wait_answer:
  1787.             smb = self.recvSMB()
  1788.             if smb.isValidAnswer(SMB.SMB_COM_WRITE_ANDX):
  1789.                 return smb
  1790.             
  1791.         
  1792.  
  1793.     
  1794.     def write_raw(self, tid, fid, data, offset = 0, wait_answer = 1):
  1795.         smb = NewSMBPacket()
  1796.         smb['Flags1'] = 24
  1797.         smb['Flags2'] = 0
  1798.         smb['Tid'] = tid
  1799.         writeRaw = SMBCommand(SMB.SMB_COM_WRITE_RAW)
  1800.         smb.addCommand(writeRaw)
  1801.         writeRaw['Parameters'] = SMBWriteRaw_Parameters()
  1802.         writeRaw['Parameters']['Fid'] = fid
  1803.         writeRaw['Parameters']['Offset'] = offset
  1804.         writeRaw['Parameters']['Count'] = len(data)
  1805.         writeRaw['Parameters']['DataLength'] = 0
  1806.         writeRaw['Parameters']['DataOffset'] = 0
  1807.         self.sendSMB(smb)
  1808.         self._SMB__sess.send_packet(data)
  1809.         if wait_answer:
  1810.             smb = self.recvSMB()
  1811.             if smb.isValidAnswer(SMB.SMB_COM_WRITE_RAW):
  1812.                 return smb
  1813.             
  1814.         
  1815.  
  1816.     
  1817.     def TransactNamedPipe(self, tid, fid, data = '', noAnswer = 0, waitAnswer = 1, offset = 0):
  1818.         self.send_trans(tid, pack('<HH', 38, fid), '\\PIPE\\\x00', '', data, noAnswer = noAnswer)
  1819.         if noAnswer or not waitAnswer:
  1820.             return None
  1821.         
  1822.         s = self.recv_packet()
  1823.         if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1824.             trans = TRANSHeader(s.get_parameter_words(), s.get_buffer())
  1825.             return trans.get_data()
  1826.         
  1827.  
  1828.     
  1829.     def nt_create_andx(self, tid, filename):
  1830.         smb = NewSMBPacket()
  1831.         smb['Flags1'] = 24
  1832.         smb['Flags2'] = SMB.FLAGS2_LONG_FILENAME
  1833.         smb['Tid'] = tid
  1834.         ntCreate = SMBCommand(SMB.SMB_COM_NT_CREATE_ANDX)
  1835.         ntCreate['Parameters'] = SMBNtCreateAndX_Parameters()
  1836.         ntCreate['Data'] = SMBNtCreateAndX_Data()
  1837.         ntCreate['Parameters']['FileNameLength'] = len(filename)
  1838.         ntCreate['Parameters']['CreateFlags'] = 22
  1839.         ntCreate['Parameters']['AccessMask'] = 131487
  1840.         ntCreate['Parameters']['CreateOptions'] = 64
  1841.         ntCreate['Data']['FileName'] = filename
  1842.         smb.addCommand(ntCreate)
  1843.         self.sendSMB(smb)
  1844.         while None:
  1845.             smb = self.recvSMB()
  1846.             if smb.isValidAnswer(SMB.SMB_COM_NT_CREATE_ANDX):
  1847.                 ntCreateResponse = SMBCommand(smb['Data'][0])
  1848.                 ntCreateParameters = SMBNtCreateAndXResponse_Parameters(ntCreateResponse['Parameters'])
  1849.                 return ntCreateParameters['Fid']
  1850.                 continue
  1851.  
  1852.     
  1853.     def login_pass_the_hash(self, user, lmhash, nthash, domain = ''):
  1854.         if len(lmhash) % 2:
  1855.             lmhash = '0%s' % lmhash
  1856.         
  1857.         if len(nthash) % 2:
  1858.             nthash = '0%s' % nthash
  1859.         
  1860.         if lmhash:
  1861.             lmhash = self.get_ntlmv1_response(a2b_hex(lmhash))
  1862.         
  1863.         if nthash:
  1864.             nthash = self.get_ntlmv1_response(a2b_hex(nthash))
  1865.         
  1866.         self._login(user, lmhash, nthash, domain)
  1867.  
  1868.     
  1869.     def login_plaintext_password(self, name, password, domain = ''):
  1870.         if password and self._SMB__ntlm_dialect.get_encryption_key():
  1871.             lmhash = ntlm.compute_lmhash(password)
  1872.             nthash = ntlm.compute_nthash(password)
  1873.             lmhash = self.get_ntlmv1_response(lmhash)
  1874.             nthash = self.get_ntlmv1_response(nthash)
  1875.         else:
  1876.             lmhash = password
  1877.             nthash = ''
  1878.         self._login(name, lmhash, nthash, domain)
  1879.  
  1880.     
  1881.     def logoff(self):
  1882.         s = SMBPacket()
  1883.         s.set_command(SMB.SMB_COM_LOGOFF_ANDX)
  1884.         s.set_parameter_words('\xff\x00\x00\x00')
  1885.         self.send_smb(s)
  1886.         s = self.recv_packet()
  1887.  
  1888.     
  1889.     def list_shared(self):
  1890.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\IPC$')
  1891.         buf = StringIO()
  1892.         
  1893.         try:
  1894.             self.send_trans(tid, '', '\\PIPE\\LANMAN\x00', '\x00\x00WrLeh\x00B13BWz\x00\x01\x00\xe0\xff', '')
  1895.             numentries = 0
  1896.             share_list = []
  1897.             while None:
  1898.                 s = self.recv_packet()
  1899.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION):
  1900.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1901.                     if not numentries:
  1902.                         (status, data_offset, numentries) = unpack('<HHH', transparam[:6])
  1903.                     
  1904.                     buf.write(transdata)
  1905.                     if not has_more:
  1906.                         share_data = buf.getvalue()
  1907.                         offset = 0
  1908.                         for i in range(0, numentries):
  1909.                             name = share_data[offset:string.find(share_data, '\x00', offset)]
  1910.                             (type, commentoffset) = unpack('<HH', share_data[offset + 14:offset + 18])
  1911.                             comment = share_data[commentoffset - data_offset:share_data.find('\x00', commentoffset - data_offset)]
  1912.                             offset = offset + 20
  1913.                             share_list.append(SharedDevice(name, type, comment))
  1914.                         
  1915.                         return share_list
  1916.                     
  1917.         finally:
  1918.             buf.close()
  1919.             self.disconnect_tree(tid)
  1920.  
  1921.  
  1922.     
  1923.     def list_path(self, service, path = '*', password = None):
  1924.         path = string.replace(path, '/', '\\')
  1925.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1926.         
  1927.         try:
  1928.             self.trans2(tid, '\x01\x00', '\x00', '\x16\x00\x00\x02\x06\x00\x04\x01\x00\x00\x00\x00' + path + '\x00', '')
  1929.             while None:
  1930.                 s = self.recv_packet()
  1931.                 if self.isValidAnswer(s, SMB.SMB_COM_TRANSACTION2):
  1932.                     (has_more, _, transparam, transdata) = self._SMB__decode_trans(s.get_parameter_words(), s.get_buffer())
  1933.                     (sid, searchcnt, eos, erroffset, lastnameoffset) = unpack('<HHHHH', transparam)
  1934.                     files = []
  1935.                     offset = 0
  1936.                     data_len = len(transdata)
  1937.                     while offset < data_len:
  1938.                         (nextentry, fileindex, lowct, highct, lowat, highat, lowmt, highmt, lowcht, hightcht, loweof, higheof, lowsz, highsz, attrib, longnamelen, easz, shortnamelen) = unpack('<lL12LLlLB', transdata[offset:offset + 69])
  1939.                         files.append(SharedFile(highct << 32 | lowct, highat << 32 | lowat, highmt << 32 | lowmt, higheof << 32 | loweof, highsz << 32 | lowsz, attrib, transdata[offset + 70:offset + 70 + shortnamelen], transdata[offset + 94:offset + 94 + longnamelen]))
  1940.                         offset = offset + nextentry
  1941.                         if not nextentry:
  1942.                             break
  1943.                             continue
  1944.                     return files
  1945.                     continue
  1946.         finally:
  1947.             self.disconnect_tree(tid)
  1948.  
  1949.  
  1950.     
  1951.     def retr_file(self, service, filename, callback, mode = SMB_O_OPEN, offset = 0, password = None):
  1952.         filename = string.replace(filename, '/', '\\')
  1953.         fid = -1
  1954.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1955.         
  1956.         try:
  1957.             (fid, attrib, lastwritetime, datasize, grantedaccess, filetype, devicestate, action, serverfid) = self.open_andx(tid, filename, mode, SMB_ACCESS_READ | SMB_SHARE_DENY_WRITE)
  1958.             if not datasize:
  1959.                 datasize = self.query_file_info(tid, fid)
  1960.             
  1961.             if self._SMB__ntlm_dialect.is_rawmode():
  1962.                 self._SMB__raw_retr_file(tid, fid, offset, datasize, callback)
  1963.             else:
  1964.                 self._SMB__nonraw_retr_file(tid, fid, offset, datasize, callback)
  1965.         finally:
  1966.             if fid >= 0:
  1967.                 self.close(tid, fid)
  1968.             
  1969.             self.disconnect_tree(tid)
  1970.  
  1971.  
  1972.     
  1973.     def stor_file(self, service, filename, callback, mode = SMB_O_CREAT | SMB_O_TRUNC, offset = 0, password = None):
  1974.         filename = string.replace(filename, '/', '\\')
  1975.         fid = -1
  1976.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  1977.         
  1978.         try:
  1979.             (fid, attrib, lastwritetime, datasize, grantedaccess, filetype, devicestate, action, serverfid) = self.open_andx(tid, filename, mode, SMB_ACCESS_WRITE | SMB_SHARE_DENY_WRITE)
  1980.             if self._SMB__ntlm_dialect.get_max_buffer() < 16384 and self._SMB__ntlm_dialect.is_rawmode():
  1981.                 self._SMB__raw_stor_file(tid, fid, offset, datasize, callback)
  1982.                 fid = -1
  1983.             else:
  1984.                 self._SMB__nonraw_stor_file(tid, fid, offset, datasize, callback)
  1985.         finally:
  1986.             if fid >= 0:
  1987.                 self.close(tid, fid)
  1988.             
  1989.             self.disconnect_tree(tid)
  1990.  
  1991.  
  1992.     
  1993.     def copy(self, src_service, src_path, dest_service, dest_path, callback = None, write_mode = SMB_O_CREAT | SMB_O_TRUNC, src_password = None, dest_password = None):
  1994.         dest_path = string.replace(dest_path, '/', '\\')
  1995.         src_path = string.replace(src_path, '/', '\\')
  1996.         src_tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + src_service, src_password)
  1997.         dest_tid = -1
  1998.         
  1999.         try:
  2000.             if src_service == dest_service:
  2001.                 dest_tid = src_tid
  2002.             else:
  2003.                 dest_tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + dest_service, dest_password)
  2004.             dest_fid = self.open_andx(dest_tid, dest_path, write_mode, SMB_ACCESS_WRITE | SMB_SHARE_DENY_WRITE)[0]
  2005.             (src_fid, _, _, src_datasize, _, _, _, _, _) = self.open_andx(src_tid, src_path, SMB_O_OPEN, SMB_ACCESS_READ | SMB_SHARE_DENY_WRITE)
  2006.             if callback:
  2007.                 callback(0, src_datasize)
  2008.             
  2009.             max_buf_size = (self._SMB__ntlm_dialect.get_max_buffer() >> 10) << 10
  2010.             read_offset = 0
  2011.             write_offset = 0
  2012.             while read_offset < src_datasize:
  2013.                 self._SMB__send_smb_packet(SMB.SMB_COM_READ_ANDX, 0, 0, src_tid, 0, pack('<BBHHLHHLH', 255, 0, 0, src_fid, read_offset, max_buf_size, max_buf_size, 0, 0), '')
  2014.                 while None:
  2015.                     s = self.recv_packet()
  2016.                     if self.isValidAnswer(s, SMB.SMB_COM_READ_ANDX):
  2017.                         offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  2018.                         (data_len, dataoffset) = unpack('<HH', s.get_parameter_words()[10 + offset:14 + offset])
  2019.                         if data_len == len(d):
  2020.                             self._SMB__send_smb_packet(SMB.SMB_COM_WRITE_ANDX, 0, 0, dest_tid, 0, pack('<BBHHLLHHHHH', 255, 0, 0, dest_fid, write_offset, 0, 0, 0, 0, data_len, 59), d)
  2021.                         else:
  2022.                             self._SMB__send_smb_packet(SMB.SMB_COM_WRITE_ANDX, 0, 0, dest_tid, 0, pack('<BBHHLLHHHHH', 255, 0, 0, dest_fid, write_offset, 0, 0, 0, 0, data_len, 59), d[dataoffset - 59:(dataoffset - 59) + data_len])
  2023.                         while None:
  2024.                             s = self.recv_packet()
  2025.                             if self.isValidAnswer(s, SMB.SMB_COM_WRITE_ANDX):
  2026.                                 offset = unpack('<H', s.get_parameter_words()[2:4])[0]
  2027.                                 write_offset = write_offset + unpack('<H', s.get_parameter_words()[4 + offset:6 + offset])[0]
  2028.                                 break
  2029.                                 continue
  2030.                         read_offset = read_offset + data_len
  2031.                         if callback:
  2032.                             callback(read_offset, src_datasize)
  2033.                         
  2034.                         break
  2035.                         continue
  2036.         finally:
  2037.             self.disconnect_tree(src_tid)
  2038.             if dest_tid > -1 and src_service != dest_service:
  2039.                 self.disconnect_tree(dest_tid)
  2040.             
  2041.  
  2042.  
  2043.     
  2044.     def check_dir(self, service, path, password = None):
  2045.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2046.         
  2047.         try:
  2048.             self._SMB__send_smb_packet(SMB.SMB_COM_CHECK_DIRECTORY, 8, 0, tid, 0, '', '\x04' + path + '\x00')
  2049.             while None:
  2050.                 s = self.recv_packet()
  2051.                 if self.isValidAnswer(s, SMB.SMB_COM_CHECK_DIRECTORY):
  2052.                     return None
  2053.                     continue
  2054.         finally:
  2055.             self.disconnect_tree(s.get_tid())
  2056.  
  2057.  
  2058.     
  2059.     def remove(self, service, path, password = None):
  2060.         self.list_path(service, path, password)
  2061.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2062.         
  2063.         try:
  2064.             self._SMB__send_smb_packet(SMB.SMB_COM_DELETE, 8, 0, tid, 0, pack('<H', ATTR_HIDDEN | ATTR_SYSTEM | ATTR_ARCHIVE), '\x04' + path + '\x00')
  2065.             while None:
  2066.                 s = self.recv_packet()
  2067.                 if self.isValidAnswer(s, SMB.SMB_COM_DELETE):
  2068.                     return None
  2069.                     continue
  2070.         finally:
  2071.             self.disconnect_tree(s.get_tid())
  2072.  
  2073.  
  2074.     
  2075.     def rmdir(self, service, path, password = None):
  2076.         self.check_dir(service, path, password)
  2077.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2078.         
  2079.         try:
  2080.             self._SMB__send_smb_packet(SMB.SMB_COM_DELETE_DIRECTORY, 8, 0, tid, 0, '', '\x04' + path + '\x00')
  2081.             while None:
  2082.                 s = self.recv_packet()
  2083.                 if self.isValidAnswer(s, SMB.SMB_COM_DELETE_DIRECTORY):
  2084.                     return None
  2085.                     continue
  2086.         finally:
  2087.             self.disconnect_tree(s.get_tid())
  2088.  
  2089.  
  2090.     
  2091.     def mkdir(self, service, path, password = None):
  2092.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2093.         
  2094.         try:
  2095.             s = SMBPacket()
  2096.             s.set_command(SMB.SMB_COM_CREATE_DIRECTORY)
  2097.             s.set_flags(8)
  2098.             s.set_flags2(0)
  2099.             s.set_tid(tid)
  2100.             s.set_parameter_words('')
  2101.             s.set_buffer('\x04' + path + '\x00')
  2102.             self.send_smb(s)
  2103.             s = self.recv_packet()
  2104.             if self.isValidAnswer(s, SMB.SMB_COM_CREATE_DIRECTORY):
  2105.                 return 1
  2106.             
  2107.             return 0
  2108.         finally:
  2109.             self.disconnect_tree(s.get_tid())
  2110.  
  2111.  
  2112.     
  2113.     def rename(self, service, old_path, new_path, password = None):
  2114.         tid = self.tree_connect_andx('\\\\' + self._SMB__remote_name + '\\' + service, password)
  2115.         
  2116.         try:
  2117.             s = SMBPacket()
  2118.             s.set_command(SMB.SMB_COM_RENAME)
  2119.             s.set_flags(8)
  2120.             s.set_flags2(0)
  2121.             s.set_tid(tid)
  2122.             s.set_parameter_words(pack('<H', ATTR_SYSTEM | ATTR_HIDDEN | ATTR_DIRECTORY))
  2123.             s.set_buffer('\x04' + old_path + '\x00\x04' + new_path + '\x00')
  2124.             self.send_smb(s)
  2125.             s = self.recv_packet()
  2126.             if self.isValidAnswer(s, SMB.SMB_COM_RENAME):
  2127.                 return 1
  2128.             
  2129.             return 0
  2130.         finally:
  2131.             self.disconnect_tree(s.get_tid())
  2132.  
  2133.  
  2134.     
  2135.     def browse_domains(self):
  2136.         return self._SMB__browse_servers(SV_TYPE_DOMAIN_ENUM, SMBDomain, '')
  2137.  
  2138.     
  2139.     def browse_servers_for_domain(self, domain = None):
  2140.         if not domain:
  2141.             domain = self._SMB__server_domain
  2142.         
  2143.         return self._SMB__browse_servers(SV_TYPE_SERVER | SV_TYPE_PRINTQ_SERVER | SV_TYPE_WFW | SV_TYPE_NT, SMBMachine, domain)
  2144.  
  2145.     
  2146.     def get_socket(self):
  2147.         return self._SMB__sess.get_socket()
  2148.  
  2149.  
  2150. ERRDOS = {
  2151.     1: 'Invalid function',
  2152.     2: 'File not found',
  2153.     3: 'Invalid directory',
  2154.     4: 'Too many open files',
  2155.     5: 'Access denied',
  2156.     6: 'Invalid file handle. Please file a bug report.',
  2157.     7: 'Memory control blocks destroyed',
  2158.     8: 'Out of memory',
  2159.     9: 'Invalid memory block address',
  2160.     10: 'Invalid environment',
  2161.     11: 'Invalid format',
  2162.     12: 'Invalid open mode',
  2163.     13: 'Invalid data',
  2164.     15: 'Invalid drive',
  2165.     16: "Attempt to remove server's current directory",
  2166.     17: 'Not the same device',
  2167.     18: 'No files found',
  2168.     32: 'Sharing mode conflicts detected',
  2169.     33: 'Lock request conflicts detected',
  2170.     80: 'File already exists' }
  2171. ERRSRV = {
  2172.     1: 'Non-specific error',
  2173.     2: 'Bad password',
  2174.     4: 'Access denied',
  2175.     5: 'Invalid tid. Please file a bug report.',
  2176.     6: 'Invalid network name',
  2177.     7: 'Invalid device',
  2178.     49: 'Print queue full',
  2179.     50: 'Print queue full',
  2180.     51: 'EOF on print queue dump',
  2181.     52: 'Invalid print file handle',
  2182.     64: 'Command not recognized. Please file a bug report.',
  2183.     65: 'Internal server error',
  2184.     67: 'Invalid path',
  2185.     69: 'Invalid access permissions',
  2186.     71: 'Invalid attribute mode',
  2187.     81: 'Server is paused',
  2188.     82: 'Not receiving messages',
  2189.     83: 'No room to buffer messages',
  2190.     87: 'Too many remote user names',
  2191.     88: 'Operation timeout',
  2192.     89: 'Out of resources',
  2193.     91: 'Invalid user handle. Please file a bug report.',
  2194.     250: 'Temporarily unable to support raw mode for transfer',
  2195.     251: 'Temporarily unable to support raw mode for transfer',
  2196.     252: 'Continue in MPX mode',
  2197.     65535: 'Unsupported function' }
  2198. ERRHRD = {
  2199.     19: 'Media is write-protected',
  2200.     20: 'Unknown unit',
  2201.     21: 'Drive not ready',
  2202.     22: 'Unknown command',
  2203.     23: 'CRC error',
  2204.     24: 'Bad request',
  2205.     25: 'Seek error',
  2206.     26: 'Unknown media type',
  2207.     27: 'Sector not found',
  2208.     28: 'Printer out of paper',
  2209.     29: 'Write fault',
  2210.     30: 'Read fault',
  2211.     31: 'General failure',
  2212.     32: 'Open conflicts with an existing open',
  2213.     33: 'Invalid lock request',
  2214.     34: 'Wrong disk in drive',
  2215.     35: 'FCBs not available',
  2216.     36: 'Sharing buffer exceeded' }
  2217.